İşlem tarafından kapsanıyorlar
Diğer cevaplayıcılar kabuk değişkeni kapsamının süreçler ve onların torunları ile ilgili olduğunu anlamama yardımcı oldu .
ls
Komut satırında olduğu gibi bir komut yazdığınızda, aslında ls
programı çalıştırmak için bir işlem öngörüyorsunuz . Yeni işlem, kabuğunuzun ebeveyni olarak sahip.
Herhangi bir sürecin alt süreçlere geçmeyen kendi "yerel" değişkenleri olabilir. Ayrıca "ortam" değişkenlerini de ayarlayabilir. Kullanarak export
bir ortam değişkeni yaratır. Her iki durumda da, ilgisiz işlemler (orijinalin eşleri) değişkeni görmeyecektir; Biz sadece çocuk süreçlerinin ne gördüğünü kontrol ediyoruz.
Eğer biz Daktilo A. arayacağım bir bash kabuğunu, varsayalım bash
aradığınız biz B. Anything arayacağım Bir çocuk bash kabuğunu oluşturur, export
hala B'de kurulacak A'da üzerinde
Şimdi, B de diyorsun FOO=b
. İki şeyden biri olacak:
- Eğer B (A'dan) bir ortam değişkeni almadıysa
FOO
, yerel bir değişken yaratacaktır. B çocukları alamayacak (B çağırmazsa export
).
- B Eğer ki bir ortam değişkeni seslenmek (A'dan) alacak
FOO
, bu olacak kendine ve sonradan çatallı çocuklar için değiştirmek . B çocukları B'nin atadığı değeri göreceklerdir. Ancak, bu A'yı hiçbir şekilde etkilemeyecektir.
İşte hızlı bir demo.
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'
Bütün bunlar benim asıl sorunumu açıklıyor: Kabuğuma koydum GEM_HOME
, ama aradığımda bundle install
çocuk süreci yarattı. Kullanmadığım export
için çocuk işlemesi kabukları alamadı GEM_HOME
.
Un ihraç
Bir değişkeni "dışa aktarabilir" - kullanarak çocuklara aktarılmasını önleyebilirsiniz - 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
, geçerli kabuk işleminin değerini belirler. Daha sonra (bundle install
) gibi bir program çalıştırırsam , bu erişemeyeceği bir alt süreç oluştururFOO
. Fakat eğer söyleseydimexport FOO=bar
, çocuk sürecinin (ve soyundan gelenlerin) buna erişimi olacaktı. Bunlardan biriexport FOO=buzz
, soyundan gelenlerin değerini değiştirme çağrısı yapabilir ya da sadeceFOO=buzz
değerini kendisi için değiştirebilir. Bu doğru mu?