Saya sebenarnya tidak tahu ada dua jenis variabel yang dapat saya akses dari baris perintah. Yang saya tahu adalah, bahwa saya dapat mendeklarasikan variabel seperti:
foo="my dear friends"
bar[0]="one"
bar[1]="two"
bar[2]="three"
atau mengaksesnya dengan tanda $, seperti:
echo $foo
echo ${bar[1]}
atau menggunakan variabel bawaan, seperti:
echo $PWD
PATH=$PATH:"/usr/bin/myProg"
Sekarang, saya mendengar ada dua (setidaknya?) jenis variabel:variabel shell dan variabel lingkungan.
- Apa gunanya memiliki dua jenis yang berbeda?
- Bagaimana cara mengetahui tipe variabel yang mana?
- Apa kegunaan khas untuk masing-masingnya?
Jawaban yang Diterima:
Variabel lingkungan adalah daftar name=value
pasang yang ada apapun programnya (shell, application, daemon…). Mereka biasanya diwarisi oleh proses anak-anak (dibuat oleh fork
/exec
sequence):proses anak-anak mendapatkan salinan variabel induknya sendiri.
Variabel shell memang ada hanya dalam konteks shell. Mereka hanya diwariskan dalam subkulit (yaitu ketika shell bercabang tanpa exec
operasi). Bergantung pada fitur shell, variabel mungkin tidak hanya berupa string sederhana seperti variabel lingkungan tetapi juga array, gabungan, variabel yang diketik seperti integer atau floating point, dll.
Saat shell dimulai, semua variabel lingkungan yang diwarisi dari induknya juga menjadi variabel shell (kecuali variabel tersebut tidak valid sebagai variabel shell dan kasus sudut lainnya seperti IFS
yang diatur ulang oleh beberapa shell) tetapi variabel yang diwarisi ini ditandai sebagai diekspor. Itu berarti mereka akan tetap tersedia untuk proses anak-anak dengan nilai yang berpotensi diperbarui yang ditetapkan oleh shell. Itu juga kasus dengan variabel yang dibuat di bawah shell dan ditandai sebagai diekspor dengan export
kata kunci.
Array dan variabel tipe kompleks lainnya tidak dapat diekspor kecuali nama dan nilainya dapat dikonversi ke name=value
pola, atau ketika mekanisme khusus shell ada (mis.:bash
mengekspor fungsi di lingkungan dan beberapa shell eksotis non POSIX seperti rc
dan es
dapat mengekspor array).
Jadi perbedaan utama antara variabel lingkungan dan variabel shell adalah cakupannya:variabel lingkungan bersifat global sedangkan variabel shell yang tidak diekspor bersifat lokal ke skrip.
Perhatikan juga bahwa shell modern (setidaknya ksh
dan bash
) mendukung cakupan variabel shell ketiga. Variabel yang dibuat dalam fungsi dengan typeset
kata kunci bersifat lokal untuk fungsi itu (Cara fungsi dideklarasikan mengaktifkan/menonaktifkan fitur ini di bawah ksh
, dan perilaku persistensi berbeda antara bash
dan ksh
). Lihat https://unix.stackexchange.com/a/28349/2594
Ini berlaku untuk shell modern seperti ksh
, dash
, bash
dan serupa. Shell Bourne lawas dan shell sintaksis non Bourne seperti csh
memiliki perilaku yang berbeda.