Bu, değerlendirmenin nasıl çalıştığı sorusuna gelir. Her iki örnek de aynı şekilde çalışır; sorun, kabuğun (bash, burada) değişkenleri nasıl genişlettiği nedeniyle oluşur.
Bu komutu yazdığınızda:
HOME="foo" echo $HOME
$HOME
Genişletilir komut çalıştırılır önce . Bu nedenle, komut için ayarladığınız yeni değere değil, orijinal değerine genişletilir. HOME
Değişken gerçekten bu ortamda değiştirildi echo
komut ancak, yazdırdığınız, çalışan $HOME
ebeveynden.
Açıklamak için şunu göz önünde bulundurun:
$ HOME="foo" bash -c 'echo $HOME'
foo
$ echo $HOME
/home/terdon
Yukarıda görebileceğiniz gibi, ilk komut geçici olarak değiştirilen değerini HOME
, ikincisi orijinali yazdırır ve değişkenin sadece geçici olarak değiştirildiğini gösterir. Çünkü bash -c ...
komutu (tek tırnak içine alınır ' '
yerine çift olanlar (bir) " "
), değişken genişletilmediğinde ve yeni bash sürecine olduğu gibi geçirilir. Bu yeni işlem daha sonra genişletir ve ayarlandığı yeni değeri yazdırır. Kullanırsanız bunun olduğunu görebilirsiniz set -x
:
$ set -x
$ HOME="hello" echo "$HOME"
+ HOME=hello
+ echo hello
hello
Yukarıda gördüğünüz gibi, değişken $HOME
asla geçilmez echo
. Sadece genişletilmiş değerini görür. İle karşılaştırmak:
$ HOME="hello" bash -c 'echo $HOME'
+ HOME=hello
+ bash -c 'echo $HOME'
hello
Burada, tek tırnaklar nedeniyle, değeri değil, değişken yeni işleme geçirilir.
local
.