GNU/Linux >> Belajar Linux >  >> Linux

Skrip Bash Dengan `set -e` Tidak Berhenti Pada Perintah `… &&...`?

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 setelah while atau until kata kunci,
bagian dari pengujian mengikuti if atau elif 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
setelah while , until ,if , atau elif 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 “|| “.


Linux
  1. Perintah Rm Dalam Skrip Bash Tidak Bekerja Dengan Variabel?

  2. nama dasar dengan spasi dalam skrip bash?

  3. Izin ditolak dengan bash.sh untuk menjalankan cron

  1. Lewati Argumen Baris Perintah ke Skrip Bash?

  2. '&&' vs. '&' dengan perintah 'test' di Bash

  3. Cara membunuh skrip python dengan skrip bash

  1. Dalam Skrip Bash Bagaimana Perintah Lanjutkan Bekerja Dengan Loop Tertanam?

  2. Tidak Dapat Menghentikan Skrip Bash Dengan Ctrl+c?

  3. Periksa Berapa Lama Skrip Bash Dijalankan Dengan Perintah Waktu