รหัสจบการทำงานท้ายสคริปต์ทุบตี


22

ฉันสับสนเกี่ยวกับความหมายของรหัสออกในตอนท้ายของสคริปต์ทุบตี: ฉันรู้ว่ารหัสออก 0 หมายความว่าเสร็จสมบูรณ์และมีหมายเลขรหัสทางออกอื่นอีกมากมาย (127 ถ้าฉันไม่เข้าใจผิด?)

คำถามของฉันเกี่ยวกับเมื่อเห็นรหัสออก 0 ที่ท้ายสคริปต์มันบังคับให้รหัสออกเป็น 0 แม้ว่าสคริปต์จะล้มเหลวหรือมีความหมายอื่นหรือไม่


2
หากสคริปต์ลงท้ายด้วยสคริปต์exit 0จะจบการทำงานด้วยรหัสการออกเป็น 0 ไม่ว่าจะเกิดอะไรขึ้นภายในสคริปต์
Hatclock

@ Hatclock ทำไมคุณไม่โพสต์คำตอบของคุณแบบเต็มคำตอบ? เป็นความคิดเห็นฉันไม่สามารถทำเครื่องหมายได้และฉันไม่คิดว่าคุณจะได้รับคะแนนอินเทอร์เน็ตปลอมสำหรับการตอบ (ใช่มั้ย) แค่คิด ... (รุ่งโรจน์สำหรับการตอบกลับอย่างรวดเร็ว)
Busted

1
ฉันอยู่ที่สถานีรถไฟในโทรศัพท์ของฉันฉันไม่ชอบพิมพ์มากเกินไปบนโทรศัพท์ของฉัน ilkkachu ดูเหมือนว่าจะมีคำตอบที่ดี!
Hatclock


2
@ Hatclock ไม่ไม่เลย หากสคริปต์ลงท้ายด้วยสคริปต์exit 0จะจบการทำงานด้วยรหัส 0 เฉพาะเมื่อมีการดำเนินการคำสั่งสุดท้ายเท่านั้น ผลกระทบเพียงอย่างเดียวของexit 0ตอนท้ายของสคริปต์คือการส่งคืน 0 แทนสถานะจากคำสั่งก่อนหน้า
Gilles 'หยุดความชั่วร้าย'

คำตอบ:


22

คำสั่ง builtin exitออกจากเชลล์ (จากการอ้างอิงของ Bash ):

exit [n]
ออกจากเชลล์โดยส่งคืนสถานะ n ไปยังพาเรนต์ของเชลล์ หากไม่ได้ระบุไว้สถานะการออกจะเป็นของคำสั่งสุดท้ายที่ดำเนินการ แทร็บใด ๆ บน EXIT จะถูกดำเนินการก่อนที่เชลล์จะยกเลิก

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

แน่นอนว่าบ่อยครั้งที่คุณต้องการใช้exitจากภายในและifเพื่อสิ้นสุดสคริปต์ที่อยู่ตรงกลาง

สิ่งเหล่านี้ควรพิมพ์ 1 ( $?มีรหัสทางออกที่ส่งคืนโดยคำสั่งก่อนหน้า):

sh -c "false" ; echo $?
sh -c "false; exit" ; echo $?

ขณะนี้ควรพิมพ์ 0:

sh -c "false; exit 0" ; echo $?

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

นอกจากนี้ช่วงมาตรฐานสำหรับรหัสออกคือ 0..255 รหัสข้างต้น 127 ถูกใช้โดยเชลล์เพื่อระบุกระบวนการที่สิ้นสุดโดยสัญญาณ แต่สามารถส่งคืนได้ตามปกติ การwaitเรียกของระบบส่งคืนค่าที่กว้างขึ้นโดยที่เหลือมีบิตสถานะที่ตั้งค่าโดยระบบปฏิบัติการ


เยี่ยมมากฉันไม่รู้เกี่ยวกับหมายเลขทางออก 8 บิต ขอบคุณ!
ถูกจับ

โปรดทราบว่าเมื่อกระบวนการถูกฆ่ากระบวนการจะไม่ออกโดยใช้รหัสการออก> 127 มันเป็นเพียงเปลือกหอยบางชุด$?ที่ 128 + signum ในกรณีนั้น ดูรหัสทางออกเริ่มต้นเมื่อกระบวนการสิ้นสุดลง? สำหรับรายละเอียด
Stéphane Chazelas

exit 0จะส่งกลับค่า 0 เท่านั้นหากมีการดำเนินการออก (สามารถออกโดยเส้นทางอื่น)
ctrl-alt-delor

18

0 หมายถึงความสำเร็จจำนวนเต็มบวกหมายถึงความล้มเหลว มีรหัสข้อผิดพลาด 255 ที่แตกต่างกัน แต่มีค่าสงวนไว้ที่ 126 และสูงกว่าเพื่อระบุว่าโปรแกรมไม่สามารถเริ่มต้น (126 หรือ 127) หรือถูกฆ่าโดยสัญญาณ (129 และสูงกว่า) ดูรหัสทางออกเริ่มต้นเมื่อกระบวนการสิ้นสุดลง? และฉันสามารถใช้ค่าส่งคืน / ออกในฟังก์ชันทุบตี / สคริปต์ได้อย่างไร สำหรับข้อมูลเพิ่มเติม.

สถานะการออกของเชลล์สคริปต์คือสถานะการออกของคำสั่งสุดท้ายที่สคริปต์ดำเนินการ ตัวอย่างเช่น

#!/bin/sh
somecommand

ส่งคืนสถานะทางออกของsomecommandในขณะที่

#!/bin/sh
somecommand
exit 0

ผลตอบแทน 0 โดยไม่คำนึงถึงสิ่งที่somecommandกลับมา สคริปต์ที่สองนี้สามารถเขียนได้

#!/bin/sh
somecommand
true

การวางexit 0ที่ส่วนท้ายของสคริปต์ไม่จำเป็นว่าจะต้องคืนค่า 0 ซึ่งจะทำให้ค่านั้นคืนเป็น 0 เมื่อถึงจุดสิ้นสุดของสคริปต์ ตัวอย่างเช่นสคริปต์ต่อไปนี้ส่งคืน 3 เสมอ:

#!/bin/sh
exit 3
exit 0

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

#!/bin/sh
}
exit 0

สคริปต์ต่อไปนี้จะคืนค่า 1 หรือ 0 ขึ้นอยู่กับอาร์กิวเมนต์แรก:

#!/bin/sh
if [ "$1" = "foo" ]; then
  exit 1
fi
exit 0

สคริปต์ต่อไปนี้จะคืนค่าสถานะsomecommandเนื่องจากset -eจะทำให้สคริปต์ออกหากsomecommandล้มเหลว:

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