Saya menggunakan set -e
untuk menghentikan skrip bash pada kesalahan pertama.
Semua berfungsi dengan baik 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 menggemakan I'm running!
, tapi yang kedua tidak. Mengapa mereka berperilaku berbeda?
UPD. Pertanyaan serupa:https://stackoverflow.com/questions/6930295/set-e-and-short-tests
Jawaban yang Diterima:
Ini adalah perilaku yang didokumentasikan.
Halaman manual bash(1) mengatakan, untuk set -e
,
Shell tidak keluar jika perintah yang gagal
adalah bagian dari daftar perintah
segera setelahwhile
atauuntil
kata kunci,
bagian dari pengujian mengikutiif
atauelif
kata-kata yang dicadangkan, bagian dari perintah apa pun yang dijalankan dalam&&
atau||
daftar kecuali perintah yang mengikuti&&
terakhir atau||
,
perintah apa pun dalam pipa kecuali yang terakhir,
atau jika nilai kembalian perintah dibalik dengan!
.
[Penekanan ditambahkan.]
Dan POSIX Bahasa Perintah Shell Spesifikasi menegaskan bahwa ini adalah perilaku yang benar:
-e
pengaturan harus diabaikan
saat menjalankan daftar gabungan
setelahwhile
,until
,if
, atauelif
kata khusus,
saluran yang dimulai dengan!
kata yang dicadangkan,
atau perintah apa pun dari daftar DAN-ATAU selain yang terakhir.
dan Bagian 2.9.3 Daftar dari dokumen itu mendefinisikan
Daftar DAN-ATAU adalah urutan dari satu atau lebih pipeline
yang dipisahkan oleh operator “&&
” dan “||
“.