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 adalahfalse
? 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.Jawaban:
Status keluar untuk tugas aneh . Cara yang paling jelas untuk sebuah tugas gagal adalah jika variabel target ditandai
readonly
.Perhatikan bahwa baik jalur benar atau salah dari pernyataan if diambil, penugasan yang gagal menghentikan eksekusi seluruh pernyataan. bash dalam mode POSIX dan ksh93 dan zsh semua akan membatalkan skrip jika tugas gagal.
Mengutip standar POSIX pada ini :
Ini persis bagian dari tata bahasa shell yang terlibat
yang berasal dari
simple_command
(simple_command → cmd_prefix → ASSIGNMENT_WORD). Jadi jika tugas berhasil maka status keluar adalah nol kecuali penggantian substitusi terlibat, dalam hal ini status keluar adalah status yang terakhir. Jika tugas gagal maka status keluar tidak nol, tetapi Anda mungkin tidak dapat menangkapnya.sumber
Kamu bilang,
Itu bukan cara yang mengerikan untuk melihatnya. Tapi ini sedikit penyederhanaan. Status pengembalian keseluruhan dari
adalah status keluar dari . The tugas yang terjadi setelah tugas tidak menetapkan status keluar keseluruhan untuk 0.cmd4
E=
D=
Juga, seperti yang ditunjukkan icarus , variabel dapat diatur sebagai hanya baca. Pertimbangkan variasi berikut pada contoh icarus:
Meskipun
A
hanya bisa dibaca, bash menjalankan substitusi perintah ke kananA=
- dan kemudian membatalkan perintah karenaA
hanya bisa dibaca. Ini lebih jauh bertentangan dengan interpretasi Anda bahwa nilai keluar dari tugas berlaku sebelum sisi kanan tugas.sumber