Environment variable adalah pasangan NAMA=nilai yang dibawa sebuah program waktu dia jalan, misalnya HOME=/home/budi atau APP_ENV=development. Program membacanya untuk tahu konfigurasinya: lagi di development atau production, database-nya di mana. Mirip menitipkan anak ke rumah nenek dengan selembar fotokopi daftar pesan. Si anak cuma membawa pesan yang kamu tulis di daftar itu, bukan semua yang ada di kepalamu. Dan kalau nenek mencoret-coret fotokopinya, daftar aslimu gak berubah.
🧪 Tebakan cepat: kamu menjalankan
APP_ENV=development, lalunode app.jsyang isinyaconsole.log(process.env.APP_ENV). Yang tercetakdevelopmentatauundefined? Tebak dulu, jawabannya ada di bagian "export: titipkan ke program yang kamu jalankan".
Variabel shell: bikin dan baca
$ NAME=Budi
$ echo "Halo $NAME"
Halo Budi
$ echo 'Halo $NAME'
Halo $NAME
$ NAME = Budi
bash: NAME: command not found
NAME=Budibikin variabel di shell yang sedang kamu pakai. Gak boleh ada spasi di sekitar=.$NAMEdiganti dengan nilainya sebelum perintah jalan, jadiechomenerima teksHalo Budi.- Di dalam kutip ganda (
"..."),$NAMEtetap diganti. Di dalam kutip tunggal ('...'), gak diganti, tercetak apa adanya. NAME = Budidengan spasi dianggap perintah bernamaNAMEdengan dua argumen, makanyacommand not found.
Nama variabel biasanya huruf besar dengan garis bawah, misalnya APP_ENV atau DB_HOST.
export: titipkan ke program yang kamu jalankan
Program yang kamu jalankan dari terminal, misalnya node app.js, disebut child process (proses anak), dan shell-mu adalah parent-nya. Child process cuma menerima salinan variabel yang sudah di-export.
app.js isinya satu baris:
console.log(process.env.APP_ENV);
$ APP_ENV=development
$ echo $APP_ENV
development
$ node app.js
undefined
$ export APP_ENV
$ node app.js
development
APP_ENV=developmentcuma bikin variabel shell.echobisa membacanya karena$APP_ENVdiganti oleh shell itu sendiri.node app.jsadalah proses baru. Tanpa export,APP_ENVgak ikut dititipkan, jadiprocess.env.APP_ENVisinyaundefined. Itu jawaban tebakannya.export APP_ENVmenandai variabel itu untuk diwariskan. Mulai sekarang setiap program yang kamu jalankan dari shell ini dapat salinannya. Bikin dan export bisa sekaligus:export APP_ENV=development.
Dua aturan lagi, masih di shell yang sama:
$ APP_ENV=production node app.js
production
$ echo $APP_ENV
development
$ bash -c 'export APP_ENV=staging'
$ echo $APP_ENV
development
NAMA=nilai perintahdalam satu baris memberi nilai itu hanya ke perintah tersebut. Shell-mu tetapdevelopment.- Child process cuma pegang salinan, jadi apa pun yang dia ubah gak balik ke parent.
bash -c '...'menjalankan bash baru sebagai child, danexportdi sana gak menyentuh shell-mu.
Variabel bawaan, PATH, dan bikin permanen
$ echo $HOME
/home/budi
$ echo $PATH
/usr/local/bin:/usr/bin:/bin
$ which node
/usr/local/bin/node
env(atauprintenv) menampilkan semua environment variable, yaitu variabel yang sudah di-export. Variabel shell yang belum di-export gak ikut tampil.HOMEfolder home-mu,USERnama user-mu,PWDfolder tempat kamu sekarang,SHELLshell yang kamu pakai.PATHadalah daftar folder yang dipisah:. Waktu kamu mengetiknode, shell mencari file bernamanodedi folder-folder itu dari kiri, dan yang pertama ketemu yang dijalankan.which nodememberi tahu yang mana.- Menambah folder ke PATH:
export PATH="$HOME/.local/bin:$PATH". Folder baru di depan, daftar lamanya tetap di belakang:.
Semua yang kamu set di terminal hilang waktu terminalnya ditutup. Biar permanen, tulis baris export itu di ~/.bashrc (bash) atau ~/.zshrc (zsh, default di macOS), lalu jalankan source ~/.bashrc atau buka terminal baru.
File .env di project
Konfigurasi aplikasi biasanya disimpan di file .env di folder project:
# Database
DB_HOST=localhost
DB_PORT=5432
DB_NAME="mydb"
# App
APP_ENV=development
SECRET='s3cret'
- Shell gak membaca file ini sendiri. Aplikasinya yang membaca: Laravel otomatis, Node.js lewat library
dotenvataunode --env-file=.env app.js(Node 20.6 ke atas). - Aturannya: satu baris satu
KEY=VALUE, baris yang diawali#adalah komentar, baris kosong dilewati, dan kutip yang membungkus nilai dibuang. Semua nilai berupa teks,5432juga. .envberisi rahasia, jadi jangan di-commit:echo ".env" >> .gitignore. Bagikan.env.exampleberisi nama-namanya saja, tanpa nilai rahasia.
Membaca .env dengan JavaScript
Latihan pelajaran ini: parseEnvFile(content) mengubah isi .env tadi jadi object.
function parseEnvFile(content) {
const result = {};
for (const rawLine of content.split("\n")) {
const line = rawLine.trim();
if (line === "" || line.startsWith("#")) continue; // baris kosong atau komentar
const eq = line.indexOf("=");
if (eq === -1) continue; // bukan KEY=VALUE
const key = line.slice(0, eq).trim();
let value = line.slice(eq + 1).trim();
const first = value[0];
if ((first === '"' || first === "'") && value.endsWith(first)) {
value = value.slice(1, -1); // buang kutip pembungkus
}
result[key] = value;
}
return result;
}
| Baris | Yang terjadi | Masuk ke object |
|---|---|---|
# Database |
komentar, dilewati | (gak ada) |
DB_HOST=localhost |
dipotong di = pertama |
DB_HOST: "localhost" |
DB_PORT=5432 |
nilainya tetap teks | DB_PORT: "5432" |
DB_NAME="mydb" |
kutip ganda dibuang | DB_NAME: "mydb" |
| (baris kosong) | dilewati | (gak ada) |
SECRET='s3cret' |
kutip tunggal dibuang | SECRET: "s3cret" |
Ditambah APP_ENV: "development", object-nya punya 5 key, jadi Object.keys(config).length hasilnya 5.
indexOf("=")mencari=yang pertama saja. Nilai yang mengandung=, misalnya tokenabc==, tetap utuh.trim()membuang spasi di awal dan akhir, tapi spasi di tengah tetap:B=dua tigajadi"dua tiga".
⚠️ Jebakan yang sering ketemu
- Spasi di sekitar
=.APP_ENV = developmentbukan bikin variabel, tapi menjalankan perintahAPP_ENVyang gak ada. - Lupa export. Programmu dapat
undefinedpadahalechomenampilkan nilainya. Cek denganenv | grep APP_ENV: kalau gak muncul, berarti belum di-export. - Menimpa PATH.
export PATH="$HOME/.local/bin"tanpa:$PATHdi belakang membuang semua folder lama, dan perintah sepertilsjadicommand not foundsampai terminalnya dibuka ulang. - Commit
.env, atau parser yang ikut menghitung komentar. Di latihan, baris#dan baris kosong gak boleh jadi key (jumlahnya harus5), kutip pembungkus harus dibuang (mydb,s3cret), dan nilai berspasi harus tetap utuh.
TL;DR: NAMA=nilai (tanpa spasi) bikin variabel shell, $NAMA membacanya, dan kutip ganda tetap mengganti $NAMA sedangkan kutip tunggal gak: NAME=Budi; echo "Halo $NAME" mencetak Halo Budi. Program yang kamu jalankan (child process) cuma dapat salinan variabel yang di-export; tanpa export, process.env.APP_ENV di Node isinya undefined. NAMA=nilai perintah berlaku untuk satu perintah saja, dan child gak bisa mengubah variabel parent. PATH daftar folder tempat shell mencari program; permanenkan di ~/.bashrc atau ~/.zshrc. File .env dibaca aplikasinya: KEY=VALUE per baris, # komentar, kutip dibuang, semua nilai teks, dan jangan di-commit.