ความหมายของ exit 0, exit 1 และ exit 2 ใน bash script


49

ฉันกำลังฝึกทำแบบฝึกหัด

เขียนสคริปต์ที่จะได้รับหมายเลขเดือนเป็นอาร์กิวเมนต์และจะแปลหมายเลขนี้เป็นชื่อเดือน ผลลัพธ์จะถูกพิมพ์ไปยัง stdout

ฉันได้แก้ปัญหา:

#test for number of argument

if [ "$#" -eq 0 ] ; 
then
   echo -e "No argument."
   echo -e "Write a number between 1 and 12."
   exit 1
elif [ "$#" -gt 1 ] ;
then
   echo -e "More than 1 argument."
   echo -e "Write a number between 1 and 12."
   exit 1
else

   numb=$1
   case "$numb" in
      1) echo "Month: January";;
      2) echo "Month: February";;
      3) echo "Month: March";;
      4) echo "Month: April";;
      5) echo "Month: May";;
      6) echo "Month: June";;
      7) echo "Month: July";;
      8) echo "Month: August";;
      9) echo "Month: September";;
     10) echo "Month: October";;
     11) echo "Month: November";;
     12) echo "Month: December";;
      *) echo -e "You wrote a wrong number. Try again with writing number between 1 and 12.";;

   esac
fi
exit 2
exit 0

ทำอะไรexit 1, exit 0และexit 2หมายความว่าและทำไมเราใช้พวกเขา?


5
รหัสที่ดำเนินการสำเร็จแล้วควรออกโดยมีรหัส 0 ค่าอื่น ๆ ระบุว่ามีข้อผิดพลาด ดูตัวอย่างรหัสทางออกที่มีความหมายพิเศษ
V. Olsen

2
สคริปต์ทุบตีเป็นเหมือนโรงภาพยนตร์มีอยู่แตกต่างกัน คำสั่ง exit ทำเครื่องหมายตำแหน่งของทางออกสำหรับล่าม bash เมื่อสคริปต์เริ่มทำงานล่ามจะต้องเรียกใช้จนกว่าจะถึงทางออกที่ใกล้ที่สุด
DepressedDaniel

5
หากนี่เป็นรหัสที่คุณเขียนคุณจะใช้คำสั่งที่ไม่เข้าใจได้อย่างไร
Dmitry Grigoryev

5
1) คุณยอมรับคำตอบทันทีหลังจากโพสต์คำถาม ให้เวลา 24 ชั่วโมงเพื่อรอคำตอบที่ดียิ่งขึ้น 2) คำตอบที่ยอมรับนั้นผิดและทำให้เข้าใจผิด คำตอบที่ถูกต้องคือ "ไม่มีความหมายเริ่มต้นสำหรับรหัสออก (เกิน 0 = สำเร็จ) คุณเป็นผู้พัฒนาสคริปต์กำหนดซีแมนติกส์" 3) หากคุณสร้างสคริปต์นั้นเหตุใดคุณจึงเพิ่มคำสั่ง exit (ซึ่งทั้งหมดนั้นไม่จำเป็นในเชิงตรรกะหรืออาจยุบลงใน "exit 1" เนื่องจากคุณใช้ถ้าไม่ใช้อย่างอื่น)
AnoE

คำตอบ:


58

ต่อไปนี้เป็นข้อมูลอ้างอิงที่ดีสำหรับรหัสทางออกของเชลล์ :

Exit code 0        Success
Exit code 1        General errors, Miscellaneous errors, such as "divide by zero" and other impermissible operations
Exit code 2        Misuse of shell builtins (according to Bash documentation)        Example: empty_function() {}

Caveat: การใช้รหัสออกที่เหมาะสมไม่ใช่ข้อกำหนดและไม่ได้ถูกบังคับใช้โดยเชลล์ นักพัฒนาสามารถเพิกเฉยคำแนะนำหากพวกเขาคิดว่าฉลาด


8
ระวังตัวด้วย รหัสออกหมายความว่าอะไรขึ้นอยู่กับผู้พัฒนาโปรแกรมทั้งหมด
muru

นอกจากนี้ในขณะที่มาเชื่อมโยงขั้นสูงทุบตี Scripting คู่มือการเรียกร้องที่จะแสดง " ลิขสิทธิ์รหัส Exit" (เน้นในต้นฉบับ) อ้างว่าเป็นทั้ง uncited และเท็จโดยสิ้นเชิง
Eliah Kagan

23

การใช้exitและตัวเลขเป็นวิธีที่สะดวกในการส่งสัญญาณผลลัพธ์ของสคริปต์ของคุณ มันเลียนแบบวิธีที่คำสั่ง bash ส่งคืนโค้ดส่งคืน ด้วยคำสั่ง bash โค้ดส่งคืนมักจะ 0 หมายความว่าทุกอย่างดำเนินการสำเร็จโดยไม่มีข้อผิดพลาด exitยังทำให้สคริปต์ของคุณหยุดทำงาน ณ จุดนั้นและกลับสู่บรรทัดคำสั่ง

โค้ดส่งคืนที่มากกว่า 0 หมายถึงข้อผิดพลาดของการเรียงลำดับบางอย่าง แต่บางครั้งข้อผิดพลาดนั้นไม่สำคัญสำหรับแต่ละคำสั่งคุณควรหาเอกสารบางอย่างที่บอกคุณว่าโค้ดส่งคืนแต่ละรายการมีความหมายอย่างไร

คุณสามารถรับโค้ดส่งคืนของคำสั่ง bash ล่าสุดโดยใช้ตัวแปรเชลล์$?ดังนี้:

$ echo "something"
something
$ echo $?
0
$ cp
cp: missing file operand
Try 'cp --help' for more information.
$ echo $?
1

เมื่อคุณใช้สิ่งนี้ในสคริปต์คุณสามารถค้นหารหัสส่งคืนในลักษณะเดียวกันเมื่อดำเนินการเสร็จสิ้น ดังนั้นคุณจะเห็นว่ามี:

exit 2
exit 0

มันไร้ความหมายเพราะคุณไม่สามารถเข้าถึงexit 0ส่วนนั้นได้


3

โดยตัวมันเองนั้นexitแสดงถึงค่าการออกเป็นศูนย์หรือการทำให้สคริปต์ของคุณสำเร็จ คุณไม่จำเป็นต้องเพิ่มอาร์กิวเมนต์ศูนย์ลงในคำสั่ง exit เพื่อระบุว่าการดำเนินการเสร็จสมบูรณ์ สคริปต์ของคุณอาจ (หรืออาจจะ) ออกได้สำเร็จแม้ว่าจะทดสอบว่ามีข้อผิดพลาดก็ตาม ในกรณีนี้คุณต้องการให้มันออกโดยมีเงื่อนไขข้อผิดพลาด (หรือ 1) โดยเฉพาะ

echo -e "Enter numbers 1-4" \c"
read NUM
case $NUM in 
    1) echo "one";;
    2) echo "two";;
    3) echo "three";;
    4) echo "four";;
    *) echo "invalid answer"
       exit 1;;
esac

exitคำสั่งในบรรทัดสุดท้ายไม่ได้ที่จะมีในทุก มันอาจจะเรียกว่ามีศูนย์หรือไม่ได้เรียกเลย โดยไม่ได้ระบุอาร์กิวเมนต์ 1 ให้กับคำสั่ง exit คำตอบในทุกกรณีเหล่านี้echo $?จะเป็นศูนย์

อย่างไรก็ตามโดยการระบุอาร์กิวเมนต์ 1 ไปยังคำสั่ง exit การตอบสนองต่อecho $?จะเป็น 1 ดังนั้นให้ใช้ 1 อาร์กิวเมนต์ไปยังคำสั่ง exit เมื่อคุณต้องการระบุว่าสคริปต์ได้ออกจากเงื่อนไขข้อผิดพลาดแล้ว

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