มีวิธีที่ฉันสามารถทำสิ่งที่ระบุไว้ในชื่อเรื่องจากคำสั่ง terminal หรือฉันจะต้องมองเข้าไปในรหัส?
มีวิธีที่ฉันสามารถทำสิ่งที่ระบุไว้ในชื่อเรื่องจากคำสั่ง terminal หรือฉันจะต้องมองเข้าไปในรหัส?
คำตอบ:
ไม่มี "สูตร" เพื่อรับความหมายของสถานะการออกของคำสั่งเทอร์มินัลที่กำหนด
ความพยายามครั้งแรกของฉันคือ manpage:
user@host:~# man ls
Exit status:
0 if OK,
1 if minor problems (e.g., cannot access subdirectory),
2 if serious trouble (e.g., cannot access command-line argument).
ประการที่สอง : Google ดูwgetเป็นตัวอย่าง
ประการที่สาม : สถานะการออกของเชลล์เช่นทุบตี Bash และบิวด์อินอาจใช้ค่าที่สูงกว่า 125 พิเศษ 127 สำหรับคำสั่งไม่พบ 126 สำหรับคำสั่งไม่สามารถเรียกใช้งานได้ สำหรับข้อมูลเพิ่มเติมโปรดดูที่รหัสทุบตีทางออก
รหัสทางออกบ่งบอกถึงสภาพความล้มเหลวเมื่อสิ้นสุดโปรแกรมและอยู่ระหว่าง 0 ถึง 255 เชลล์และบิวด์อินอาจใช้เฉพาะค่าที่สูงกว่า 125 เพื่อระบุโหมดความล้มเหลวเฉพาะดังนั้นรายการรหัสอาจแตกต่างกันระหว่างเชลล์และระบบปฏิบัติการ (เช่น Bash ใช้ค่า 128 + N เป็นสถานะออก) ดู: ทุบตี - 3.7.5 สถานะออกman bash
หรือ
โดยทั่วไปเป็นศูนย์สถานะออกแสดงให้เห็นว่าคำสั่งที่ประสบความสำเร็จ , ไม่ใช่ศูนย์สถานะออกแสดงให้เห็นความล้มเหลว
ในการตรวจสอบรหัสข้อผิดพลาดที่ส่งคืนโดยคำสั่งคุณสามารถพิมพ์$?
รหัสออกสุดท้ายหรือ${PIPESTATUS[@]}
ให้รายการของค่าสถานะการออกจากไปป์ไลน์ (เป็น Bash) หลังจากที่เชลล์สคริปต์ออก
ไม่มีรายการรหัสทางออกทั้งหมดที่สามารถพบได้อย่างไรก็ตามมีความพยายามจัดระบบหมายเลขสถานะการออกในแหล่งเคอร์เนล แต่นี่เป็นจุดประสงค์หลักสำหรับโปรแกรมเมอร์ C / C ++ และมาตรฐานที่คล้ายคลึงกันสำหรับการเขียนสคริปต์อาจเหมาะสม
รายการ sysexits ทั้งบน Linux และ BSD / OS X พร้อมด้วยรหัสทางออกที่ดีกว่าสำหรับโปรแกรม (64-78) สามารถพบได้ใน/usr/include/sysexits.h
(หรือ: man sysexits
บน BSD):
0 /* successful termination */
64 /* base value for error messages */
64 /* command line usage error */
65 /* data format error */
66 /* cannot open input */
67 /* addressee unknown */
68 /* host name unknown */
69 /* service unavailable */
70 /* internal software error */
71 /* system error (e.g., can't fork) */
72 /* critical OS file missing */
73 /* can't create (user) output file */
74 /* input/output error */
75 /* temp failure; user is invited to retry */
76 /* remote error in protocol */
77 /* permission denied */
78 /* configuration error */
/* maximum listed value */
รายการข้างต้นจัดสรรรหัสทางออกที่ไม่ได้ใช้ก่อนหน้านี้จาก 64-78 ช่วงของรหัสการออกที่ยังไม่ได้จัดสรรจะถูก จำกัด ในอนาคต
อย่างไรก็ตามค่าข้างต้นส่วนใหญ่จะใช้ใน sendmail และไม่มีใครใช้ดังนั้นพวกเขาจึงไม่ได้ใกล้เคียงกับมาตรฐาน (ตามที่@Gillesชี้)
ในเปลือกสถานะการออกมีดังนี้ (ขึ้นอยู่กับ Bash):
1
- 125
- คำสั่งดำเนินการไม่สำเร็จ ตรวจสอบหน้าคำสั่งเพื่อดูความหมายของสถานะตัวอย่างน้อย ๆ ด้านล่าง:
1
- Catchall สำหรับข้อผิดพลาดทั่วไป
ข้อผิดพลาดอื่น ๆ เช่น "หารด้วยศูนย์" และการดำเนินการที่ไม่อนุญาตอื่น ๆ
ตัวอย่าง:
$ let "var1 = 1/0"; echo $?
-bash: let: var1 = 1/0: division by 0 (error token is "0")
1
2
- การใช้งานบิลด์เชลล์ในทางที่ผิด
คำหลักหรือคำสั่งที่ขาดหายไปหรือปัญหาการอนุญาต (และรหัสการส่งคืนค่าต่างจากการเปรียบเทียบไฟล์ไบนารีที่ล้มเหลว)
ตัวอย่าง:
empty_function() {}
6
- ไม่มีอุปกรณ์หรือที่อยู่ดังกล่าว
ตัวอย่าง:
$ curl foo; echo $?
curl: (6) Could not resolve host: foo
6
124
- คำสั่งหมดเวลา
125
- หากคำสั่งล้มเหลวโปรดดูที่: coreutils126
- หากพบคำสั่ง แต่ไม่สามารถเรียกใช้ได้ (เช่นไม่สามารถเรียกใช้งานได้)
ปัญหาการอนุญาตหรือคำสั่งไม่ใช่การปฏิบัติการ
ตัวอย่าง:
$ /dev/null
$ /etc/hosts; echo $?
-bash: /etc/hosts: Permission denied
126
127
- หากไม่พบคำสั่งกระบวนการลูกที่สร้างขึ้นเพื่อรันคำสั่งจะส่งคืนสถานะนั้น
ปัญหาที่อาจเกิดกับ
$PATH
หรือพิมพ์ผิด
ตัวอย่าง:
$ foo; echo $?
-bash: foo: command not found
127
128
- อาร์กิวเมนต์ไม่ถูกต้องถึง exit
exit ใช้จำนวนเต็มเท่านั้น args ในช่วง 0 - 255
ตัวอย่าง:
$ exit 3.14159
-bash: exit: 3.14159: numeric argument required
128
- 254
- สัญญาณข้อผิดพลาดร้ายแรง "n" - คำสั่งเสียชีวิตเนื่องจากการรับสัญญาณ รหัสสัญญาณจะถูกเพิ่มเป็น 128 (128 + สัญญาณ) เพื่อรับสถานะ (Linux man 7 signal
:, BSD:) man signal
, ตัวอย่างด้านล่าง:
130
- คำสั่งถูกยกเลิกเนื่องจากมีการกด Ctrl-C, 130-128 = 2 (SIGINT)
ตัวอย่าง:
$ cat
^C
$ echo $?
130
137
- หากคำสั่งถูกส่งKILL(9)
สัญญาณ (128 + 9) สถานะการออกของคำสั่งเป็นอย่างอื่น
kill -9 $PPID
ของสคริปต์
141
- SIGPIPE
- เขียนบนไพพ์โดยไม่มีตัวอ่าน
ตัวอย่าง:
$ hexdump -n100000 /dev/urandom | tee &>/dev/null >(cat > file1.txt) >(cat > file2.txt) >(cat > file3.txt) >(cat > file4.txt) >(cat > file5.txt)
$ find . -name '*.txt' -print0 | xargs -r0 cat | tee &>/dev/null >(head /dev/stdin > head.out) >(tail /dev/stdin > tail.out)
xargs: cat: terminated by signal 13
$ echo ${PIPESTATUS[@]}
0 125 141
143
- คำสั่งถูกยกเลิกโดยรหัสสัญญาณ 15 (128 + 15 = 143)
ตัวอย่าง:
$ sleep 5 && killall sleep &
[1] 19891
$ sleep 100; echo $?
Terminated: 15
143
255
* - สถานะออกจากช่วง
exit ใช้จำนวนเต็มเท่านั้น args ในช่วง 0 - 255
ตัวอย่าง:
$ sh -c 'exit 3.14159'; echo $?
sh: line 0: exit: 3.14159: numeric argument required
255
ตามตารางด้านบนรหัสทางออก 1 - 2, 126 - 165, และ 255 มีความหมายพิเศษดังนั้นควรหลีกเลี่ยงสำหรับพารามิเตอร์ทางออกที่ผู้ใช้ระบุ
โปรดทราบว่าค่าออกจากช่วงสามารถส่งผลให้เกิดรหัสออกที่ไม่คาดคิด (เช่นออก 3809 ให้รหัสออกที่ 225, 3809% 256 = 225)
ดู:
errno
ค่าถูกใช้โดย API ของระบบ แต่ไม่ได้ใช้เป็นสถานะออก (ไม่อยู่ในช่วงที่เหมาะสม) และไม่เกี่ยวข้องกับการใช้สคริปต์เชลล์ ค่า Sysexits นั้นมาจาก sendmail และไม่มีใครใช้เลยพวกเขาไม่ได้อยู่ใกล้กับมาตรฐานในระยะไกล
คุณจะต้องมองเข้าไปในรหัส / เอกสาร อย่างไรก็ตามสิ่งที่ใกล้เคียงกับ "มาตรฐาน" คือerrno.h
errno.h
ไม่เกี่ยวข้องเมื่อมันมาถึงรหัสทางออกข้อความผิดพลาดเท่านั้น
sysexits.h
เช่นวางใน อย่างไรก็ตามบางโปรแกรมกลับคืนค่าerrno
และฉันคิดว่าการคืนค่ากลับมาerrno
เหมาะสมที่สุด ไม่สามารถจัดการerrno
ได้แพร่กระจายขึ้นไปเช่นข้อยกเว้น (การerrno
อยู่ฟังก์ชั่นกลับเช่น-1
หรือ0|NULL
) เนื่องจากโปรแกรมเป็นเพียงฟังก์ชั่นแม้ว่าฟังก์ชั่นที่ทำงานในพื้นที่ที่อยู่แยกต่างหากมันทำให้รู้สึกว่าโปรแกรมอาจต้องการที่จะดำเนินการerrno
เผยแพร่ต่อไปในขอบเขตกระบวนการ
"($numeric_code|$bsd_decoded|$errno_plus_one_decoded)"
เพื่อให้ฉันได้รับสิ่งที่ต้องการ
เท่าที่ฉันรู้มีเพียงสองค่ามากกว่าหรือน้อยกว่าค่ามาตรฐาน - ทั้งกำหนดไว้ในstdlib.h
การใช้งานด้วย exit ():
และค่ามาตรฐานเดียวที่แท้จริงคือการมีความหมายเหมือนกันสำหรับทุกโปรแกรมในโลกคือ 0 (ศูนย์) ซึ่งหมายถึงความสำเร็จ
โปรแกรมที่แตกต่างกันแนะนำรายการต่าง ๆ ของ "ความล้มเหลว" ที่ส่งคืนมาเพื่อแยกแยะหรือเน้นข้อผิดพลาดที่แตกต่างกัน (ประเภทหรือความรุนแรงต่างกัน) บางโปรแกรมใช้ค่าที่ส่งคืนเพื่อรายงานจำนวนเต็มของข้อผิดพลาดรันไทม์ที่ค้นพบ (เช่นจำนวนการทดสอบหน่วยที่ล้มเหลวในชุดสูท)
ฉันไม่แนะนำให้แนะนำ "มาตรฐานใหม่" ชนิดใดที่ขยายความ stdlib.h