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
$HOMEGeniş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. HOMEDeğişken gerçekten bu ortamda değiştirildi echokomut ancak, yazdırdığınız, çalışan $HOMEebeveynden.
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.