Bir kabuk örneğinin çevresel değişkenlerini diğerinden ayarlamakla ilgileniyorum. Bu yüzden biraz araştırma yapmaya karar verdim. Bir okuduktan sonra numarayı ait sorular hakkında bu ben bunu test etmeye karar verdi.
Her ikisi de çalışan iki A ve B mermisi (PID 420) ürettim zsh
. Kabuk AI'dan aşağıdakileri koştu.
sudo gdb -p 420
(gdb) call setenv("FOO", "bar", 1)
(gdb) detach
Kabuk B çalıştığımda env
değişken FOO gerçekten bar değeri ile ayarlandığını görebilirsiniz. Bu, FOO'nun B kabuğu ortamında başarılı bir şekilde başlatıldığını düşündürüyor. Ancak, FOO yazdırmaya çalışırsam ayarlanmadığını belirten boş bir satır alıyorum. Bana göre burada bir çelişki varmış gibi geliyor.
Bu hem kendi Arch GNU / Linux sistemimde hem de bir Ubuntu VM'de test edildi. Ayrıca bash
değişkenin env'de bile görünmediği yerde bunu test ettim . Bu benim için hayal kırıklığı yaratıyor olsa da, kabuk yumurtlama zamanında ortamının bir kopyasını önbelleğe alır ve sadece bunu kullanır (bağlantılı sorulardan birinde önerilmiştir). Bu hala zsh
değişkeni neden görebildiğini cevaplamıyor .
Çıktı neden echo $FOO
boş?
DÜZENLE
Yorumlardaki girdiden sonra biraz daha test yapmaya karar verdim. Sonuçlar aşağıdaki tablolarda görülebilir. İlk sütunda, FOO
değişkenin enjekte edildiği kabuk bulunur . İlk satır, çıktısı altında görülebilen komutu içerir. Değişken FOO
: kullanılarak enjekte edildi sudo gdb -p 420 -batch -ex 'call setenv("FOO", "bar", 1)'
. Zsh: komutuna özgü komutlar zsh -c '...'
da bash kullanılarak test edildi. Sonuçlar aynıydı, çıktıları kısalık için çıkarıldı.
Arch GNU / Linux, zsh 5.3.1, bash 4.4.12 (1)
| | env | grep FOO | echo $FOO | zsh -c 'env | grep FOO' | zsh -c 'echo $FOO' | After export FOO |
|------|------------------|-----------|---------------------------|----------------------|-----------------------------------|
| zsh | FOO=bar | | FOO=bar | bar | No Change |
| bash | | bar | | | Value of FOO visible in all tests |
Ubuntu 16.04.2 LTS, zsh 5.1.1, bash 4.3.48 (1)
| | env | grep FOO | echo $FOO | zsh -c 'env | grep FOO' | zsh -c 'echo $FOO' | After export FOO |
|------|------------------|-----------|---------------------------|----------------------|-----------------------------------|
| zsh | FOO=bar | | FOO=bar | bar | No Change |
| bash | | bar | | | Value of FOO visible in all tests |
Yukarıdaki sonuçların dağılım agnostik olduğu ima edilmektedir. Bu bana daha fazlasını anlatmaz zsh
ve bash
değişkenlerin ayarını farklı şekilde ele almaz . Ayrıca, export FOO
bu bağlamda kabuğa bağlı olarak çok farklı davranışlar vardır. Umarım bu testler başkası için net bir şey yapabilir.
env
) değiştirilmiş ortamı görür.
zsh
onu kabuk değişkeni olarak görünür kılmıyor , ancak alt süreçlere ( Eğer bir tane ayarlarken,) gözlemledim bash
gelmez bir kabuk değişkeni olarak görünür hale getirmek ancak yok değil çocuğun süreçlerine üzerine geçirilecek neden! Görünüşe göre zsh ve bash değişkenleri yönetmek için farklı stratejiler kullanıyor, zsh çevre dışı değişkenleri izliyor ve bash (alt kabuk olmayan) bir çocuğu başlatırken dezenfekte ettiği her şeyi kendi ortamında saklıyor.
export FOO
içinde bash
?
zsh -c 'echo $FOO'
yerine (tek tırnak kullanın!) Yaparsanız ne olur ? O zaman görebiliyor musun?