Eğer kullandığınız zaman LANG=C gcc ... ne olur kabuk için LANG setleri olmasıdır gccbireyin çevreye sadece ve değil için geçerli bir ortamda kendisi ( nota bakın ). Bu yüzden gccbittikten sonra LANGönceki değerine geri döner (veya ayarlanmadan).
Ek olarak, onu kullandığınızda , eko yerine, $ A'nın yerine A=10 echo $Ageçen kabuktur ve bu değiştirme ("genişleme" olarak adlandırılır) ifadenin değerlendirilmesinden önce gerçekleşir (atama dahil), bu nedenle beklenen Adeğerin önceden ayarlanmış olması gerekir. içinde geçerli olduğunu açıklamaya öncesinde çevre.
Bu yüzden A=10 echo $Abeklendiği gibi çalışmaz: A=10yankı için ayarlanır, ancak yankı içsel olarak ortam değişkeninin değerini yok sayar A. Ve $Aşu anki kabuğunda ayarlanan (hiçbiri olmayan) değerle değiştirilir ve sonra yankıya bir argüman olarak iletilir.
Sizin varsayım doğruysa Yani: VAR=value command does işi, ancak bu yalnızca alakalı commandiçten kullandığı VAR. Değilse, hala geçebilir valuebir şekilde argüman için command, ama argümanlar ile değiştirilir akım onlar kullanım öncesinde ayarlanmalıdır böylece, kabuk:VAR=value; command "$VAR"
Yürütülebilir bir komut dosyasının nasıl oluşturulduğunu biliyorsanız, bunu bir test olarak deneyebilirsiniz:
#!/bin/sh
echo "1st argument is $1"
echo "A is $A"
Farklı kaydet testscriptve dene:
$ A=5; A=10 testscript "$A"; echo "$A"
1st argument is 5
A is 10
5
Son fakat en az değil, kabuk ve çevre değişkenleri ve program argümanları arasındaki farkı bilmeye değer .
İşte bazı iyi referanslar:
.
(*) Not: Teknik olarak kabuk gelmez Bazı komutlar gibi: neden burada da mevcut ortamda ayarlanır ve var echo, readve testolan kabuk yerleşikleri ve bu nedenle onlar bir çocuk süreç yumurtlamaya yoktur. Mevcut ortamda koşuyorlar. Ancak, kabuk atama için sadece komut çalışana kadar devam eder, bu nedenle tüm pratik amaçlar için etki aynıdır: atama sadece o tek komut tarafından görülür.
A=10 (echo $A)ve alabilir10miyim?