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 setelahwhileatauuntilkata kunci,
bagian dari pengujian mengikutiifatauelifkata-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:
-epengaturan harus diabaikan
saat menjalankan daftar gabungan
setelahwhile,until,if, atauelifkata 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 “||“.