POSIX mermilerinde aşağıdaki örneklere ve bunların çıktılarına bakın:
false;echo $?
veyafalse || echo 1
:1
false;foo="bar";echo $?
veyafoo="bar" && echo 0
:0
foo=$(false);echo $?
veyafoo=$(false) || echo 1
:1
foo=$(true);echo $?
veyafoo=$(true) && echo 0
:0
Https://stackoverflow.com/questions/6834487/what-is-the-variable-in-shell-scripting adresindeki en yüksek oyu alan yanıtta belirtildiği gibi :
$?
son yürütülen komutun dönüş değerini bulmak için kullanılır.
Bu muhtemelen bu durumda biraz yanıltıcıdır, bu yüzden bu iş parçacığından bir gönderide de belirtilen POSIX tanımını alalım:
? En son boru hattının ondalık çıkış durumuna genişler (bkz. Boru Hatları).
Öyleyse, bir atamanın kendisi sıfır çıkış değerine sahip bir komut (ya da daha doğrusu bir boru hattı parçası) olarak sayılır, ancak atamanın sağ tarafından uygulanmadan önce görünür (örn. Komut ikamesi buradaki örneklerimde çağırır).
Bu davranışın pratik açıdan nasıl mantıklı olduğunu görüyorum, ancak bana göre ödevin kendisi bu sırayla sayılır. Belki benim için neden garip olduğunu daha açık hale getirmek için, ödevin bir işlev olduğunu varsayalım:
ASSIGNMENT( VARIABLE, VALUE )
o foo="bar"
zaman olur
ASSIGNMENT( "foo", "bar" )
ve foo=$(false)
şöyle bir şey olurdu
ASSIGNMENT( "foo", EXECUTE( "false" ) )
hangi anlamına gelir EXECUTE
çalışır birinci ve ancak ondan sonra ASSIGNMENT
çalıştırılır ama hala var EXECUTE
burada önemli olan durum.
Değerlendirmemde doğru muyum veya bir şeyi yanlış anlıyor / özlüyor muyum? Bu davranışı "tuhaf" olarak görmem için doğru nedenler bunlar mı?
false;foo="bar";echo $?
Son çıkan gerçek komut neden her zaman 0false
döndürüyor ?" Temel olarak, çıkış kodları söz konusu olduğunda atamaların özel davranmasıdır. Görevin sağ tarafının bir parçası olarak çalışan bir şey olmadığı için çıkış kodları her zaman 0'dır.