วิธีหนึ่งที่พบบ่อยคือ:
die() {
IFS=' ' # make sure "$*" is joined with spaces
# output the arguments if any on stderr:
[ "$#" -eq 0 ] || printf '%s\n' "$*" 1>&2
exit 1
}
จากนั้นคุณใช้มันเช่นนี้:
mkdir -p some/path || die "mkdir failed with status $?"
หรือถ้าคุณต้องการให้มันรวมสถานะการออกคุณสามารถเปลี่ยนเป็น:
die() {
last_exit_status=$?
IFS=' '
printf '%s\n' "FATAL ERROR: $* (status $last_exit_status)" 1>&2
exit 1
}
แล้วใช้มันง่ายกว่า:
mkdir -p some/path || die "mkdir failed"
เมื่อล้มเหลวmkdir
อาจมีข้อความแจ้งข้อผิดพลาดอยู่แล้วดังนั้นข้อความที่สองอาจซ้ำซ้อนและคุณสามารถทำได้:
mkdir -p some/path || exit # with the same (failing) exit status as mkdir's
mkdir -p some/path || exit 1 # with exit status 1 always
(หรือใช้ตัวแปรแรกdie
ด้านบนโดยไม่มีอาร์กิวเมนต์)
ในกรณีที่คุณไม่เคยเห็นcommand1 || command2
มาก่อนมันจะทำงานcommand1
และถ้าล้มเหลวก็วิ่งcommand1
command2
ดังนั้นคุณสามารถอ่านได้เช่น "ทำไดเรกทอรีหรือตาย"
ตัวอย่างของคุณจะมีลักษณะดังนี้:
mkdir -p some/path || die "mkdir failed"
cd some/path || die "cd failed"
some_command || die "some_command failed"
หรือคุณสามารถจัดตำแหน่งdies
เพิ่มเติมทางด้านขวาเพื่อให้รหัสหลักชัดเจนยิ่งขึ้น
mkdir -p some/path || die "mkdir failed"
cd some/path || die "cd failed"
some_command || die "some_command failed"
หรือบนบรรทัดต่อไปนี้เมื่อบรรทัดคำสั่งยาว:
mkdir -p some/path ||
die "mkdir failed"
cd some/path ||
die "cd failed"
some_command ||
die "some_command failed"
นอกจากนี้หากคุณจะใช้ชื่อsome/path
หลาย ๆ ครั้งให้จัดเก็บไว้ในตัวแปรเพื่อให้คุณไม่ต้องพิมพ์ต่อไปและสามารถเปลี่ยนได้ง่ายหากคุณต้องการ และเมื่อผ่านการขัดแย้งตัวแปรคำสั่งให้ตรวจสอบการใช้ตัวคั่นตัวเลือกเพื่อให้การโต้แย้งไม่ได้ถ่ายเป็นตัวเลือกถ้ามันเริ่มต้นด้วย--
-
dir=some/path
mkdir -p -- "$dir" || die "Cannot make $dir"
cd -P -- "$dir" || die "Cannot cd to $dir"
some_command || die "Cannot run some_command"