ฉันจะรับรายการรหัสทางออก (และ / หรือรหัสส่งคืน) และความหมายสำหรับคำสั่ง / ยูทิลิตี้ได้อย่างไร


17

มีวิธีที่ฉันสามารถทำสิ่งที่ระบุไว้ในชื่อเรื่องจากคำสั่ง terminal หรือฉันจะต้องมองเข้าไปในรหัส?

คำตอบ:


15

ไม่มี "สูตร" เพื่อรับความหมายของสถานะการออกของคำสั่งเทอร์มินัลที่กำหนด

ความพยายามครั้งแรกของฉันคือ 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 สำหรับคำสั่งไม่สามารถเรียกใช้งานได้ สำหรับข้อมูลเพิ่มเติมโปรดดูที่รหัสทุบตีทางออก


ใช่บางคนข้อมูล ... หน้าจะรวมพวกเขา .. และฉันเป็นห่วงกับผู้ที่ไม่ได้ .. และฉันรู้ว่าการวิจัยเว็บเป็นตัวเลือกเสมอ .. ตอนนี้ดูเหมือนว่ามันเป็นเพียงรหัสทางออก bash ที่ฉันต้องมองหา ..
แม่นยำ

12

รหัสทางออกบ่งบอกถึงสภาพความล้มเหลวเมื่อสิ้นสุดโปรแกรมและอยู่ระหว่าง 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- หากคำสั่งล้มเหลวโปรดดูที่: coreutils
  • 126 - หากพบคำสั่ง แต่ไม่สามารถเรียกใช้ได้ (เช่นไม่สามารถเรียกใช้งานได้)

    ปัญหาการอนุญาตหรือคำสั่งไม่ใช่การปฏิบัติการ

    ตัวอย่าง:

    $ /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 และไม่มีใครใช้เลยพวกเขาไม่ได้อยู่ใกล้กับมาตรฐานในระยะไกล
Gilles 'หยุดความชั่วร้าย'

7

คุณจะต้องมองเข้าไปในรหัส / เอกสาร อย่างไรก็ตามสิ่งที่ใกล้เคียงกับ "มาตรฐาน" คือerrno.h


ขอบคุณสำหรับการชี้ไฟล์ส่วนหัว .. ลองดูในเอกสารของ utils ไม่กี่ .. ยากที่จะหารหัสทางออกดูเหมือนว่าส่วนใหญ่จะเป็น stderrs ...
แม่นยำ

3
errno.hไม่เกี่ยวข้องเมื่อมันมาถึงรหัสทางออกข้อความผิดพลาดเท่านั้น
Gilles 'ดังนั้นหยุดความชั่วร้าย'

โปรแกรมส่วนใหญ่กลับรหัสออกไปตามการประชุม BSD sysexits.hเช่นวางใน อย่างไรก็ตามบางโปรแกรมกลับคืนค่าerrnoและฉันคิดว่าการคืนค่ากลับมาerrnoเหมาะสมที่สุด ไม่สามารถจัดการerrnoได้แพร่กระจายขึ้นไปเช่นข้อยกเว้น (การerrnoอยู่ฟังก์ชั่นกลับเช่น-1หรือ0|NULL) เนื่องจากโปรแกรมเป็นเพียงฟังก์ชั่นแม้ว่าฟังก์ชั่นที่ทำงานในพื้นที่ที่อยู่แยกต่างหากมันทำให้รู้สึกว่าโปรแกรมอาจต้องการที่จะดำเนินการerrnoเผยแพร่ต่อไปในขอบเขตกระบวนการ
PSkocik

@PSkocik คุณมีตัวอย่างของคำสั่งดังกล่าวหรือไม่? errnos ไม่สามารถพกพาได้ (ค่าไม่สอดคล้องกันในระบบ) และไม่มีวิธีการพกพาเพื่อรับชื่อ err หรือข้อความจากค่า (zsh มี builtin สำหรับสิ่งนั้น) ไม่พูดถึงว่าบางระบบมี errnos มากกว่า 123 ที่จะขัดแย้งกับรหัสข้อผิดพลาดที่มีความหมายพิเศษทั่วไป โดยปกติคำสั่งจะพิมพ์ข้อความจาก errno และส่งคืนสถานะออกจากความสำเร็จ / ความล้มเหลว คำสั่งมีไว้สำหรับผู้ใช้ การเรียกใช้ฟังก์ชัน / ระบบมีไว้สำหรับโปรแกรมเมอร์
Stéphane Chazelas

@ StéphaneChazelasฉันเคยเห็นมาแล้วสองครั้ง แต่ไม่ได้อยู่ในโปรแกรมที่มีชื่อเสียงฉันต้องยอมรับ ฉันกลับ errno +1 โดยส่วนตัวในระบบของเล่นของฉันเมื่อเร็ว ๆ นี้ (เพื่อให้ 1 ยังคงหมายถึง "ข้อผิดพลาดใด ๆ ") เพราะฉันคิดว่าการเรียงลำดับ errno ของข้ามขอบเขตกระบวนการทำให้รู้สึกดีกว่าการแปลตามแบบแผน BSD การเรียกใช้ฟังก์ชันเป็นหลักและฟังก์ชั่นใช้ errno ผมใช้ถอดรหัสสุดท้ายออกจากสถานะของตัวเองใน PROMPT_COMMAND ของฉัน (ทุบตี) "($numeric_code|$bsd_decoded|$errno_plus_one_decoded)"เพื่อให้ฉันได้รับสิ่งที่ต้องการ
PSkocik

1

เท่าที่ฉันรู้มีเพียงสองค่ามากกว่าหรือน้อยกว่าค่ามาตรฐาน - ทั้งกำหนดไว้ในstdlib.hการใช้งานด้วย exit ():

  • EXIT_SUCCESS (= 0)
  • EXIT_FAILURE (= 1)

และค่ามาตรฐานเดียวที่แท้จริงคือการมีความหมายเหมือนกันสำหรับทุกโปรแกรมในโลกคือ 0 (ศูนย์) ซึ่งหมายถึงความสำเร็จ

โปรแกรมที่แตกต่างกันแนะนำรายการต่าง ๆ ของ "ความล้มเหลว" ที่ส่งคืนมาเพื่อแยกแยะหรือเน้นข้อผิดพลาดที่แตกต่างกัน (ประเภทหรือความรุนแรงต่างกัน) บางโปรแกรมใช้ค่าที่ส่งคืนเพื่อรายงานจำนวนเต็มของข้อผิดพลาดรันไทม์ที่ค้นพบ (เช่นจำนวนการทดสอบหน่วยที่ล้มเหลวในชุดสูท)

ฉันไม่แนะนำให้แนะนำ "มาตรฐานใหม่" ชนิดใดที่ขยายความ stdlib.h

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.