Ortam değişkenleri ve komut arasında noktalı virgül ne zaman kullanılır?


14

Herkes LANGbash tarafından güncellenmiş olarak görülmesi için noktalı virgülün neden gerekli olduğunu açıklayabilir mi?

Çalışmıyor:

> LANG=Ja_JP bash -c "echo $LANG"
en_US

İşler:

> LANG=Ja_JP ; bash -c "echo $LANG"
Ja_JP

Linux üzerinde hem bash 4.1.10 hem de cygwin altında aynı sürümle çalışıyorum

Yanıtlar:


23

Parametre ve diğer genişletme türleri, komut okunduğunda, yürütülmeden önce gerçekleştirilir.

İlk sürüm,, LANG=Ja_JP bash -c "echo $LANG"tek bir komuttur. Bu şekilde ayrıştırıldıktan sonra, herhangi bir şey yürütülmeden önce değerine $LANGgenişletilir en_US. Bir kez bashbu bir süreç çatallar ekler, giriş işlem tamamlandıktan LANG=Ja_JPbeklendiği gibi çevreye ve çalıştırır bash -c echo en_US.

Tek tırnak, yani LANG=Ja_JP bash -c 'echo $LANG'çıktılar ile genişletmeyi önleyebilirsiniz Ja_JP.

Komutun bir parçası olarak değişken atamanız olduğunda atamanın kabuğunuzun komutunu değil, yalnızca o komutun ortamını etkilediğini unutmayın.

İkinci sürüm, LANG=Ja_JP; bash -c "echo $LANG"aslında sırayla yürütülen iki ayrı komuttur. Birincisi, komut olmadan basit bir değişken atamasıdır, bu nedenle geçerli kabuğunuzu etkiler.

Böylece, bir parçanın yüzeysel ayrımına rağmen, iki parçacığınız temel olarak farklıdır ;.

Tamamen konu dışı, ancak bir .UTF-8zaman ayarı eklemenizi tavsiye edebilirim LANG. Bugünlerde 21. yüzyılda Unicode kullanmamak için iyi bir neden yok.


Harika cevap - teşekkürler! UTF-8 ilavesi ile ilgili. Bazıları oldukça eski olan birkaç platformda çalışması gereken bir uygulamanın yerel kullanımını test etmeye çalışıyorum. Bunun gibi farklılıklar (neyse ki açıkladınız) ve linux ve cygwin arasındaki farklar arasında kendimi bir otobüse atmak üzereyim!
Richard Corden

5

VAR=value; somecommand eşittir

VAR=value
somecommand

Bunlar birbiri ardına yürütülen ilgisiz komutlardır. İlk komut kabuk değişkenine bir değer atar VAR. VARZaten bir ortam değişkeni olmadığı sürece , ortama aktarılmaz, kabuğun içinde kalır. Bir açıklama çevreye export VARihracat yapacaktı VAR.

VAR=value somecommandfarklı bir sözdizimidir. Ödev VAR=valueçevreye yapılır, ancak bu ödev somecommandkabuğun sonraki yürütülmesi için değil , yalnızca yürütme ortamında yapılır .

Örnek olarak:

# Assume neither VAR1 nor VAR2 is in the environment
VAR1=value
echo $VAR1                        # displays "value"
env | grep '^VAR1='               # displays nothing
VAR2=value env | grep '^VAR2='    # displays "VAR2=value"
echo $VAR2                        # displays nothing

Bir kabuk ile çevre değişkeni arasındaki farkı gerçekten düşünmemiştim. Biraz araştırma yapmam gerekecek. Cevap için teşekkürler.
Richard Corden
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.