Environment Variables — Terminal

Apa itu Environment Variables? Environment variables (variabel lingkungan) adalah pasangan key-value yang menyimpan konfigurasi untuk sistem operasi dan…

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, lalu node app.js yang isinya console.log(process.env.APP_ENV). Yang tercetak development atau undefined? 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

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

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

Variabel bawaan, PATH, dan bikin permanen

$ echo $HOME
/home/budi
$ echo $PATH
/usr/local/bin:/usr/bin:/bin
$ which node
/usr/local/bin/node

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'

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.

⚠️ Jebakan yang sering ketemu

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.

Yang akan kamu pelajari