Saya menggunakan set -e
untuk menghentikan skrip bash pada kesalahan pertama .
Semua berfungsi OK kecuali saya menggunakan perintah dengan &&
:
$ cat script
set -e
cd not_existing_dir && echo 123
echo "I'm running! =P"
$
$ ./script
./script: line 2: cd: not_existing_dir: No such file or directory
I'm running! =P
$
dibandingkan dengan:
$ cat script
set -e
cd not_existing_dir
echo "I'm running! =P"
$
$ ./script
./script: line 2: cd: not_existing_dir: No such file or directory
$
Contoh pertama masih menggema I'm running!
, tetapi yang kedua tidak. Mengapa mereka berperilaku berbeda?
UPD. Pertanyaan serupa: /programming/6930295/set-e-and-short-tests
bash
shell-script
shell
907
sumber
sumber
cd
perintah gagalset -e
perilaku mengejutkan.Jawaban:
Ini adalah perilaku yang terdokumentasi. The bash (1) halaman manual mengatakan, untuk
set -e
,Dan Spesifikasi Bahasa Perintah POSIX Shell mengkonfirmasi bahwa ini adalah perilaku yang benar:
dan Bagian 2.9.3 Daftar dokumen yang didefinisikan
sumber
The
set -e
pilihan tidak memiliki efek dalam beberapa situasi, dan ini adalah perilaku standar dan portabel di POSIX compliant shell.Perintah yang gagal adalah bagian dari pipa:
akan dicetak
printed
.Dan hanya kegagalan dari pipa itu sendiri yang dipertimbangkan:
tidak akan mencetak apa pun.
Gagal menjalankan perintah dalam daftar senyawa berikut
while
,until
,if
,elif
kata reserved, pipa yang diawali dengan!
kata reserved, atau perintah apapun sebagai bagian dari&&
atau||
daftar kecuali yang terakhir:Perintah terakhir gagal masih membuat
set -e
terpengaruh:The subkulit gagal dalam perintah senyawa:
sumber
echo "printed"
danecho "not_printed"
dalam contoh Anda (bukanecho 1
).set -e
menyebabkan keluar(false && true); echo not here
, tetapi tidak di{ false && true; }; echo here
, meskipun YMMV dengan shell yang berbeda dan bahkan versi yang berbeda dari shell yang sama. Saya tidak akan menyentuhset -e
dengan tongkang tongkang dan akan melakukan penanganan kesalahan yang tepat sebagai gantinya.Dugaan saya adalah jika-maka kondisi secara keseluruhan bernilai true.
Saya mencoba
siapa yang memberi
kode kesalahan ditangkap oleh kondisi jika, maka bash tidak akan memicu akhir eksekusi.
sumber
if ... fi