Mereka dicakup oleh proses
Penjawab lain membantu saya untuk memahami bahwa ruang lingkup variabel shell adalah tentang proses dan turunannya .
Ketika Anda mengetik perintah seperti ls
pada baris perintah, Anda sebenarnya sedang forking proses untuk menjalankan ls
program. Proses baru memiliki shell Anda sebagai induknya.
Setiap proses dapat memiliki variabel "lokal" sendiri, yang tidak diteruskan ke proses anak. Itu juga dapat mengatur variabel "lingkungan", yang. Menggunakan export
menciptakan variabel lingkungan. Dalam kedua kasus tersebut, proses yang tidak terkait (rekan asli) tidak akan melihat variabel; kita hanya mengendalikan apa yang dilihat oleh proses anak.
Misalkan Anda memiliki bash shell, yang akan kita panggil A. Anda mengetik bash
, yang membuat shell proses bash anak, yang akan kami panggil B. Apa pun yang Anda panggil export
di A masih akan diatur dalam B.
Sekarang, di B, katamu FOO=b
. Satu dari dua hal akan terjadi:
- Jika B tidak menerima (dari A) variabel lingkungan yang disebut
FOO
, itu akan membuat variabel lokal. Anak-anak B tidak akan mendapatkannya (kecuali B memanggil export
).
- Jika B memang menerima (dari A) variabel lingkungan yang dipanggil
FOO
, ia akan memodifikasinya untuk dirinya sendiri dan selanjutnya anak-anak yang bercabang dua . Anak-anak B akan melihat nilai yang diberikan B. Namun, ini tidak akan memengaruhi A sama sekali.
Ini demo cepat.
FOO=a # set "local" environment variable
echo $FOO # 'a'
bash # forks a child process for the new shell
echo $FOO # not set
exit # return to original shell
echo $FOO # still 'a'
export FOO # make FOO an environment variable
bash # fork a new "child" shell
echo $FOO # outputs 'a'
FOO=b # modifies environment (not local) variable
bash # fork "grandchild" shell
echo $FOO # outputs 'b'
exit # back to child shell
exit # back to original shell
echo $FOO # outputs 'a'
Semua ini menjelaskan masalah asli saya: Saya mengatur GEM_HOME
di shell saya, tetapi ketika saya menelepon bundle install
, itu menciptakan proses anak. Karena saya belum pernah menggunakan export
, proses anak tidak menerima cangkang GEM_HOME
.
Tidak mengekspor
Anda dapat "membatalkan ekspor" suatu variabel - mencegahnya diteruskan ke anak-anak - dengan menggunakan export -n FOO
.
export FOO=a # Set environment variable
bash # fork a shell
echo $FOO # outputs 'a'
export -n FOO # remove environment var for children
bash # fork a shell
echo $FOO # Not set
exit # back up a level
echo $FOO # outputs 'a' - still a local variable
FOO=bar
, itu menetapkan nilai untuk proses shell saat ini. Jika saya kemudian menjalankan program like (bundle install
), itu menciptakan proses anak, yang tidak mendapatkan aksesFOO
. Tetapi jika saya katakanexport FOO=bar
, proses anak (dan turunannya) akan memiliki akses ke sana. Salah satu dari mereka dapat, pada gilirannya, memintaexport FOO=buzz
untuk mengubah nilai bagi keturunannya, atau hanyaFOO=buzz
mengubah nilai hanya untuk dirinya sendiri. Apakah itu benar?