Lihat contoh berikut dan hasilnya dalam cangkang POSIX:
false;echo $?
ataufalse || echo 1
:1
false;foo="bar";echo $?
ataufoo="bar" && echo 0
:0
foo=$(false);echo $?
ataufoo=$(false) || echo 1
:1
foo=$(true);echo $?
ataufoo=$(true) && echo 0
:0
Seperti yang disebutkan oleh jawaban pilihan tertinggi di /programming/6834487/what-is-the-variable-in-shell-scripting :
$?
digunakan untuk menemukan nilai kembali dari perintah yang dieksekusi terakhir.
Ini mungkin agak menyesatkan dalam kasus ini, jadi mari kita dapatkan definisi POSIX yang juga dikutip dalam posting dari utas itu:
? Perluas ke status keluar desimal dari pipa terbaru (lihat Pipa).
Jadi tampak seolah-olah penugasan itu sendiri dihitung sebagai perintah (atau lebih tepatnya bagian pipa) dengan nilai keluar nol tetapi yang berlaku sebelum sisi kanan penugasan (misalnya substitusi perintah memanggil dalam contoh saya di sini).
Saya melihat bagaimana perilaku ini masuk akal dari sudut pandang praktis tetapi tampaknya agak tidak biasa bagi saya bahwa tugas itu sendiri akan dihitung dalam urutan itu. Mungkin untuk memperjelas mengapa itu aneh bagi saya, mari kita asumsikan tugasnya adalah fungsi:
ASSIGNMENT( VARIABLE, VALUE )
maka foo="bar"
akan menjadi
ASSIGNMENT( "foo", "bar" )
dan foo=$(false)
akan menjadi sesuatu seperti
ASSIGNMENT( "foo", EXECUTE( "false" ) )
yang berarti EXECUTE
berjalan pertama dan hanya setelah ASSIGNMENT
itu dijalankan tetapi masih EXECUTE
status yang penting di sini.
Apakah saya benar dalam penilaian saya atau saya salah paham / melewatkan sesuatu? Apakah itu alasan yang tepat bagi saya untuk melihat perilaku ini sebagai "aneh"?
false;foo="bar";echo $?
selalu kembali 0 ketika perintah sebenarnya terakhir yang dijalankan adalah false
? Ini pada dasarnya bahwa tugas berperilaku khusus ketika datang untuk keluar dari kode. Kode keluar mereka selalu 0, kecuali ketika itu bukan karena sesuatu yang berlari sebagai bagian dari sisi kanan penugasan.