Pertama, saya khawatir penjelasan -o
opsi yang disajikan oleh http://explainshell.com tidak sepenuhnya benar.
Mengingat itu set
adalah perintah bulit-in, kita dapat melihat dokumentasinya dengan help
mengeksekusi help set
:
-o option-name
Set the variable corresponding to option-name:
allexport same as -a
braceexpand same as -B
emacs use an emacs-style line editing interface
errexit same as -e
errtrace same as -E
functrace same as -T
hashall same as -h
histexpand same as -H
history enable command history
ignoreeof the shell will not exit upon reading EOF
interactive-comments
allow comments to appear in interactive commands
keyword same as -k
monitor same as -m
noclobber same as -C
noexec same as -n
noglob same as -f
nolog currently accepted but ignored
notify same as -b
nounset same as -u
onecmd same as -t
physical same as -P
pipefail the return value of a pipeline is the status of
the last command to exit with a non-zero status,
or zero if no command exited with a non-zero status
posix change the behavior of bash where the default
operation differs from the Posix standard to
match the standard
privileged same as -p
verbose same as -v
vi use a vi-style line editing interface
xtrace same as -x
Seperti yang Anda lihat -o pipefail
artinya:
nilai balik dari sebuah pipa adalah status dari perintah terakhir untuk keluar dengan status bukan nol, atau nol jika tidak ada perintah yang keluar dengan status bukan nol
Tetapi tidak dikatakan: Write the current settings of the options to standard output in an unspecified format.
Sekarang, -x
digunakan untuk debugging seperti yang Anda sudah tahu dan -e
akan berhenti mengeksekusi setelah kesalahan pertama dalam skrip. Pertimbangkan skrip seperti ini:
#!/usr/bin/env bash
set -euxo pipefail
echo hi
non-existent-command
echo bye
The echo bye
garis tidak akan pernah dieksekusi ketika -e
digunakan karena
non-existent-command
tidak kembali 0:
+ echo hi
hi
+ non-existent-command
./setx.sh: line 5: non-existent-command: command not found
Tanpa -e
baris terakhir akan dicetak karena meskipun terjadi kesalahan, kami tidak meminta Bash
untuk keluar secara otomatis:
+ echo hi
hi
+ non-existent-command
./setx.sh: line 5: non-existent-command: command not found
+ echo bye
bye
set -e
sering diletakkan di bagian atas skrip untuk memastikan bahwa skrip akan dihentikan ketika kesalahan pertama ditemukan - misalnya, jika mengunduh file gagal, tidak masuk akal untuk mengekstraknya.
set -uxo pipefail
).set -e
itu hanya akan menyebabkan skrip akan diakhiri karena kesalahan. Dalam contoh Anda, hanya satu dari banyak opsi yang ada bersama-uxo pipefail
.e
argumen.0
pada kesuksesan dan bukan nol pada kegagalan, maka-e
itu berguna tetapi karena yang lainnya harus digunakan dengan hati-hati.