ครั้งแรกฉันกลัวว่าคำอธิบายของ-o
ตัวเลือกที่เสิร์ฟโดยhttp://explainshell.comนั้นไม่ถูกต้องทั้งหมด
ระบุว่าset
เป็นคำสั่ง bulit ในเราสามารถดูเอกสารของมันด้วยhelp
การดำเนินการ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
ตามที่คุณเห็น-o pipefail
หมายถึง:
ค่าส่งคืนของไปป์ไลน์คือสถานะของคำสั่งสุดท้ายเพื่อออกโดยมีสถานะไม่เป็นศูนย์หรือเป็นศูนย์หากไม่มีคำสั่งออกจากสถานะไม่เป็นศูนย์
แต่มันไม่ได้พูดว่า: Write the current settings of the options to standard output in an unspecified format.
ตอนนี้-x
ใช้สำหรับการดีบักตามที่คุณรู้แล้วและ-e
จะหยุดการทำงานหลังจากข้อผิดพลาดแรกในสคริปต์ พิจารณาสคริปต์เช่นนี้
#!/usr/bin/env bash
set -euxo pipefail
echo hi
non-existent-command
echo bye
echo bye
บรรทัดจะไม่ถูกดำเนินการเมื่อ-e
ถูกนำมาใช้เพราะ
non-existent-command
ไม่ได้กลับ 0:
+ echo hi
hi
+ non-existent-command
./setx.sh: line 5: non-existent-command: command not found
หากไม่มี-e
บรรทัดสุดท้ายจะถูกพิมพ์เพราะแม้ว่าเกิดข้อผิดพลาดเราไม่ได้บอกBash
ให้ออกโดยอัตโนมัติ:
+ echo hi
hi
+ non-existent-command
./setx.sh: line 5: non-existent-command: command not found
+ echo bye
bye
set -e
มักจะอยู่ด้านบนสุดของสคริปต์เพื่อให้แน่ใจว่าสคริปต์จะหยุดทำงานเมื่อพบข้อผิดพลาดครั้งแรก - ตัวอย่างเช่นหากการดาวน์โหลดไฟล์ล้มเหลว
set -uxo pipefail
)