สำหรับการเขียนสคริปต์เชลล์ในบางครั้งฉันก็จะเทียบเท่าsysexist.h
เชลล์ที่มีรหัสทางออกของเชลล์ที่สงวนไว้ (นำหน้าด้วยS_EX_
) ซึ่งฉันตั้งชื่อไว้exit.sh
มันเป็นพื้น:
EX_OK=0 # successful termination
EX__BASE=64 # base value for error messages
EX_USAGE=64 # command line usage error
EX_DATAERR=65 # data format error
EX_NOINPUT=66 # cannot open input
EX_NOUSER=67 # addressee unknown
EX_NOHOST=68 # host name unknown
EX_UNAVAILABLE=69 # service unavailable
EX_SOFTWARE=70 # internal software error
EX_OSERR=71 # system error (e.g., can't fork)
EX_OSFILE=72 # critical OS file missing
EX_CANTCREAT=73 # can't create (user) output file
EX_IOERR=74 # input/output error
EX_TEMPFAIL=75 # temp failure; user is invited to retry
EX_PROTOCOL=76 # remote error in protocol
EX_NOPERM=77 # permission denied
EX_CONFIG=78 # configuration error
EX__MAX=78 # maximum listed value
#System errors
S_EX_ANY=1 #Catchall for general errors
S_EX_SH=2 #Misuse of shell builtins (according to Bash documentation); seldom seen
S_EX_EXEC=126 #Command invoked cannot execute Permission problem or command is not an executable
S_EX_NOENT=127 #"command not found" illegal_command Possible problem with $PATH or a typo
S_EX_INVAL=128 #Invalid argument to exit exit 3.14159 exit takes only integer args in the range 0 - 255 (see first footnote)
#128+n Fatal error signal "n" kill -9 $PPID of script $? returns 137 (128 + 9)
#255* Exit status out of range exit -1 exit takes only integer args in the range 0 - 255
S_EX_HUP=129
S_EX_INT=130
#...
และสามารถสร้างขึ้นด้วย:
#!/bin/sh
src=/usr/include/sysexits.h
echo "# Generated from \"$src\""
echo "# Please inspect the source file for more detailed descriptions"
echo
< "$src" sed -rn 's/^#define *(\w+)\s*(\d*)/\1=\2/p'| sed 's:/\*:#:; s:\*/::'
cat<<'EOF'
#System errors
S_EX_ANY=1 #Catchall for general errors
S_EX_SH=2 #Misuse of shell builtins (according to Bash documentation); seldom seen
S_EX_EXEC=126 #Command invoked cannot execute Permission problem or command is not an executable
S_EX_NOENT=127 #"command not found" illegal_command Possible problem with $PATH or a typo
S_EX_INVAL=128 #Invalid argument to exit exit 3.14159 exit takes only integer args in the range 0 - 255 (see first footnote)
#128+n Fatal error signal "n" kill -9 $PPID of script $? returns 137 (128 + 9)
#255* Exit status out of range exit -1 exit takes only integer args in the range 0 - 255
EOF
$(which kill) -l |tr ' ' '\n'| awk '{ printf "S_EX_%s=%s\n", $0, 128+NR; }'
ฉันไม่ได้ใช้มันมากนัก แต่สิ่งที่ฉันใช้ก็คือฟังก์ชั่นของเชลล์ที่ใช้รหัสข้อผิดพลาดในรูปแบบสตริง ฉันตั้งชื่อมันexit2str
แล้ว สมมติว่าคุณตั้งชื่อดังกล่าวข้างต้นexit.sh
กำเนิดexit.sh.sh
รหัสสำหรับexit2str
สามารถสร้างขึ้นด้วย ( exit2str.sh.sh
):
#!/bin/sh
echo '
exit2str(){
case "$1" in'
./exit.sh.sh | sed -nEe's|^(S_)?EX_(([^_=]+_?)+)=([0-9]+).*|\4) echo "\1\2";;|p'
echo "
esac
}"
ฉันใช้สิ่งนี้ในส่วนPS1
ของเชลล์เชิงโต้ตอบของฉันดังนั้นหลังจากที่แต่ละคำสั่งที่ฉันรันฉันสามารถเห็นสถานะการออกและรูปแบบสตริงของมัน (ถ้ามันมีรูปแบบสตริงที่รู้จัก):
[15:58] pjump@laptop:~
(0=OK)$
[15:59] pjump@laptop:~
(0=OK)$ fdsaf
fdsaf: command not found
[15:59] pjump@laptop:~
(127=S_NOENT)$ sleep
sleep: missing operand
Try 'sleep --help' for more information.
[15:59] pjump@laptop:~
(1=S_ANY)$ sleep 100
^C
[15:59] pjump@laptop:~
(130=S_INT)$ sleep 100
^Z
[1]+ Stopped sleep 100
[15:59] pjump@laptop:~
(148=S_TSTP)$
ในการรับสิ่งเหล่านี้คุณต้องมี insourcable สำหรับฟังก์ชัน exit2str:
$ ./exit2str.sh.sh > exit2str.sh #Place this somewhere in your PATH
จากนั้นใช้ใน~/.bashrc
การบันทึกและแปลรหัสออกในแต่ละพรอมต์คำสั่งและแสดงพรอมต์ของคุณ ( PS1
):
# ...
. exit2str.sh
PROMPT_COMMAND='lastStatus=$(st="$?"; echo -n "$st"; str=$(exit2str "$st") && echo "=$str"); # ...'
PS1="$PS1"'\n($lastStatus)\$'
# ...
มันค่อนข้างมีประโยชน์สำหรับการสังเกตว่าบางโปรแกรมปฏิบัติตามอนุสัญญารหัสออกและบางโปรแกรมไม่ใช้เพื่อเรียนรู้เกี่ยวกับระเบียบการออกรหัสหรือเพียงเพื่อให้สามารถเห็นสิ่งที่เกิดขึ้นได้ง่ายขึ้น หลังจากใช้มาระยะหนึ่งฉันสามารถพูดได้ว่าเชลล์สคริปต์ที่เน้นระบบจำนวนมากปฏิบัติตามอนุสัญญา EX_USAGE
เป็นเรื่องธรรมดาโดยเฉพาะอย่างยิ่งแม้ว่ารหัสอื่น ๆ ไม่มาก ฉันพยายามติดตามการประชุมเป็นครั้งคราวถึงแม้ว่าจะมี$S_EX_ANY
(1) สำหรับคนขี้เกียจ (ฉันเป็นคนเดียว)