Sorun Yeniden Ziyaret Edildi
Açıkçası, kılavuz bu noktada kafa karıştırıcı. GNU Bash kılavuzu diyor ki:
Herhangi bir basit komut veya işlev için ortam [bunun yerleşikleri hariç tuttuğuna dikkat edin], Kabuk Parametrelerinde açıklandığı gibi parametre atamalarının önüne geçici olarak artırılabilir. Bu atama ifadeleri yalnızca o komut tarafından görülen ortamı etkiler.
Eğer gerçekten cümleyi ayrıştırmak değilse, ne söylediğini olmasıdır çevre komut / fonksiyon için ebeveyn süreci için ortam değiştirilmiş, ancak değildir. Yani, bu işe yarayacak:
$ TESTVAR=bbb env | fgrep TESTVAR
TESTVAR=bbb
env komutunun ortamı çalıştırılmadan önce değiştirildiğinden. Ancak bu işe yaramayacak:
$ set -x; TESTVAR=bbb echo aaa $TESTVAR ccc
+ TESTVAR=bbb
+ echo aaa ccc
aaa ccc
kabuk tarafından parametre yorumlamasının gerçekleştirilmesi nedeniyle.
Tercüman Adımları
Problemin bir başka kısmı da Bash'in yorumlayıcı için şu adımları tanımlamasıdır :
- Girdisini bir dosyadan (Kabuk Komut Dosyalarına bakın), -c çağırma seçeneğine argüman olarak sağlanan bir dizeden (Bash'i Çağırmak'a bakın) veya kullanıcının terminalinden okur.
- Alıntıda açıklanan alıntı kurallarına uyarak girdiyi kelimelere ve işleçlere böler. Bu belirteçler meta karakterlerle ayrılır. Takma ad genişletme bu adımda gerçekleştirilir (bkz. Diğer Adlar).
- Belirteçleri basit ve bileşik komutlara ayırır (bkz. Kabuk Komutları).
- Çeşitli kabuk genişletmelerini gerçekleştirir (bkz. Kabuk Genişletmeleri), genişletilmiş belirteçleri dosya adları listelerine (bkz. Dosya Adı Genişletme), komutlar ve bağımsız değişkenlere böler.
- Gerekli yeniden yönlendirmeleri gerçekleştirir (bkz. Yeniden Yönlendirmeler) ve yeniden yönlendirme işleçlerini ve bunların işlenenlerini bağımsız değişken listesinden kaldırır.
- Komutu yürütür (bkz. Komutları Yürütme).
- İsteğe bağlı olarak komutun tamamlanmasını bekler ve çıkış durumunu toplar (bkz. Çıkış Durumu).
Burada olan şey, yerleşiklerin kendi yürütme ortamlarına sahip olmadıkları için değiştirilmiş ortamı asla görmedikleri. Buna ek olarak, basit komutları (örn / bin / eko) do (env örneği çalıştı neden olan) modifiye edilmiş bir ennvironment olsun ama kabuk genişleme gerçekleşiyor akım adımda 4. çevre.
Diğer bir deyişle, 'aaa $ TESTVAR ccc'yi / bin / echo'ya iletmiyorsunuz; enterpolasyonlu dizeyi (mevcut ortamda genişletildiği şekilde) / bin / echo'ya geçiriyorsunuz. Bu durumda, mevcut ortamda TESTVAR olmadığı için, komuta basitçe 'aaa ccc' geçersiniz .
Özet
Belgeler çok daha net olabilir. İyi ki Stack Overflow var!
Ayrıca bakınız
http://www.gnu.org/software/bash/manual/bashref.html#Command-Execution-Environment