Program di Linux tidak hidup sendirian: bash, ls, sampai editor teks perlu tahu di mana home directory kita, direktori mana saja yang berisi program, dan bahasa apa yang kita pakai. Jawaban untuk semua itu disimpan dalam environment variables — kumpulan pasangan nama dan nilai yang diwariskan dari shell ke setiap program yang dijalankan. Pada Chapter ini kita akan membaca variabel dengan echo dan printenv, menetapkannya dengan export, dan membedah peran PATH yang paling berpengaruh.
Membaca Variabel dengan echo dan printenv #
Tanda dolar di depan sebuah nama meminta bash menggantikannya dengan isi variabel tersebut. Dua variabel yang paling sering dibaca adalah HOME dan PATH:
echo "$HOME"
printenv HOME
echo "$PATH"Output yang Dihasilkan:
/home/budi
/home/budi
/usr/local/bin:/usr/bin:/binBaris pertama dan kedua sama-sama mencetak isi HOME — echo membacanya lewat perluasan $HOME di shell, sedangkan printenv membacanya langsung dari environment prosesnya. Tanda kutip ganda pada "$HOME" menjaga isinya tetap satu argumen utuh. Nilai PATH di contoh tampil pendek karena lingkungan buku ini sengaja dibuat minimal; di komputer kita umumnya berisi daftar lebih panjang seperti /usr/local/bin:/usr/bin:/bin:/usr/local/games.
Bila sebuah nama belum pernah diisi, perluasannya kosong — echo "[$TIDAK_ADA]" mencetak [], bukan error. Perintah printenv memakai kode keluar 1 untuk nama yang tidak ditemukan, perilaku yang akan kita pahami setelah membahas exit code.
Menetapkan Variabel dan Mengekspornya #
Penugasan biasa seperti NAMA=Budi menciptakan variabel shell: ia terbaca di sesi kita, tetapi tidak diwariskan ke program lain. Agar terlihat oleh proses anak — skrip, subshell, atau aplikasi apa pun — variabel itu harus dinaikkan menjadi environment variable lewat export. Perbedaannya bisa dibuktikan dengan menjalankan bash baru sebagai proses anak:
NAMA=Budi
echo "di shell : $NAMA"
bash -c 'echo "tanpa export: [$NAMA]"'
export NAMA
bash -c 'echo "dengan export: $NAMA"'Output yang Dihasilkan:
di shell : Budi
tanpa export: []
dengan export: BudiMari kita bedah baris per barisnya:
- Baris 1 (
NAMA=Budi): membuat variabel shell bernamaNAMAdengan isiBudi; tanpa spasi di sekitar tanda sama dengan. - Baris 2:
echomembaca$NAMAdari dalam shell yang sama, sehingga nilainya tercetak. - Baris 3 (
bash -c '...'): menjalankanbashbaru sebagai proses anak; variabel yang belum diekspor tidak ikut menyeberang, sehingga$NAMAdi dalamnya kosong. - Baris 5 (
export NAMA): menaikkanNAMAke environment sesi ini. - Baris 6: proses anak kedua kini mewarisi
NAMAdan berhasil mencetak isinya.
Proses anak selalu menerima salinan environment saat ia lahir; perubahan yang dilakukannya tidak menular kembali ke induknya.
Penugasan Hanya untuk Satu Perintah #
Sering kali kita ingin mengubah satu variabel sesaat — misalnya memaksa urutan collation saat mengurutkan — tanpa mencemari sesi. Bentuk NAMA=nilai perintah menetapkan variabel hanya untuk perintah itu saja:
NAMA=Siti printenv NAMA
echo "setelahnya: [$NAMA]"Output yang Dihasilkan:
Siti
setelahnya: []printenv di baris pertama melihat NAMA berisi Siti, lalu di baris kedua NAMA sudah tidak berisi apa pun karena penugasan satu perintah tidak meninggalkan jejak. Pola ini umum dipakai seperti LC_ALL=C sort data.txt atau TZ=UTC date, dan juga menjadi cara cepat menguji program dengan konfigurasi berbeda tanpa mengubah apa pun secara permanen.
Variabel PATH yang Menentukan #
Saat kita mengetik nama perintah, bash mencarinya satu per satu di setiap direktori yang tercantum pada PATH, lalu menjalankan kecocokan pertama. Daftar environment yang sedang berlaku dapat dilihat dengan env, yang biasanya disaring agar tidak panjang:
env | sort | grep -E '^(HOME|PATH)='Output yang Dihasilkan:
HOME=/home/budi
PATH=/usr/local/bin:/usr/bin:/binMenambahkan direktori milik kita sendiri ke depan daftar membuat skrip pribadi bisa dipanggil dari mana saja:
export PATH="$HOME/bin:$PATH"Detail lengkap opsi env dan printenv terdokumentasi di halaman manual env(1)
serta printenv(1)
.
Variabel menyimpan konfigurasi untuk satu nama; sering kali kita juga ingin merangkai beberapa perintah menjadi satu alur kerja. Untuk itu shell punya operator penggabung — materi Chapter Command Chaining.