มีสองประเด็นที่เกี่ยวข้องที่นี่
อันดับแรกคำถามของ OP ทำไม 0 ถึงเป็นจริง แต่เท็จคือ 1 ในเชลล์? และประการที่สองเหตุใดแอปพลิเคชันจึงส่งคืน 0 สำหรับความสำเร็จและไม่ใช่ศูนย์สำหรับความล้มเหลว
ในการตอบคำถามของ OP เราจำเป็นต้องเข้าใจคำถามที่สอง คำตอบมากมายสำหรับโพสต์นี้ได้อธิบายว่านี่เป็นอนุสัญญาและได้ระบุรายละเอียดบางประการที่อนุสัญญานี้ให้ไว้ รายละเอียดบางส่วนเหล่านี้สรุปไว้ด้านล่าง
เหตุใดแอปพลิเคชันจึงคืนค่าเป็น 0 สำหรับความสำเร็จและไม่ใช่ศูนย์สำหรับความล้มเหลว
รหัสที่เรียกใช้การดำเนินการจำเป็นต้องรู้สองสิ่งเกี่ยวกับสถานะการออกของการดำเนินการ การดำเนินการออกสำเร็จหรือไม่ [* 1] และหากการดำเนินการออกไม่สำเร็จเหตุใดการดำเนินการจึงออกไม่สำเร็จ สามารถใช้ค่าใดก็ได้เพื่อแสดงถึงความสำเร็จ แต่ 0 สะดวกกว่าหมายเลขอื่น ๆ เนื่องจากเป็นแบบพกพาระหว่างแพลตฟอร์ม สรุปคำตอบของ xibo สำหรับคำถามนี้เมื่อวันที่ 16 ส.ค. 2554:
Zero ไม่ขึ้นอยู่กับการเข้ารหัส
หากเราต้องการจัดเก็บหนึ่ง (1) ในคำจำนวนเต็ม 32 บิตคำถามแรกจะเป็น "big-endian word หรือ little-endian word?" ตามด้วย "ไบต์ที่เขียนเป็นคำ endian ตัวน้อยยาวเท่าใด "ในขณะที่ศูนย์จะมีลักษณะเหมือนกันเสมอ
นอกจากนี้ยังต้องคาดหวังว่าบางคนจะร่าย errno ให้เป็นถ่านหรือสั้นในบางจุดหรือแม้กระทั่งลอย (int) ((ถ่าน) ENOLCK) ไม่ใช่ ENOLCK เมื่อถ่านมีความยาวอย่างน้อย 8 บิต (UNIX 7 บิตสนับสนุนเครื่องถ่าน ASCII) ในขณะที่ (int) ((ถ่าน) 0) เป็น 0 โดยไม่ขึ้นกับ รายละเอียดสถาปัตยกรรมของถ่าน
เมื่อพิจารณาแล้วว่า 0 จะเป็นค่าส่งกลับสำหรับความสำเร็จดังนั้นจึงควรใช้ค่าใด ๆ ที่ไม่ใช่ศูนย์สำหรับความล้มเหลว สิ่งนี้ทำให้รหัสทางออกจำนวนมากสามารถตอบคำถามว่าเหตุใดการดำเนินการจึงล้มเหลว
ทำไม 0 จึงเป็นจริง แต่เท็จคือ 1 ในเชลล์
หนึ่งในการใช้งานพื้นฐานของเชลล์คือการทำให้กระบวนการทำงานอัตโนมัติโดยการเขียนสคริปต์ โดยปกติจะหมายถึงการเรียกใช้การดำเนินการแล้วทำอย่างอื่นตามเงื่อนไขตามสถานะการออกของการดำเนินการ Philippe A.อธิบายอย่างดีในคำตอบของเขาสำหรับโพสต์นี้ว่า
ใน bash และในเปลือกหอย unix โดยทั่วไปค่าที่ส่งคืนไม่ใช่บูลีน เป็นรหัสทางออกจำนวนเต็ม
จำเป็นต้องตีความสถานะการออกของการดำเนินการเหล่านี้เป็นค่าบูลีน มันสมเหตุสมผลที่จะแมป0
สถานะการออกสำเร็จ ( ) กับจริงและสถานะการออกที่ไม่ใช่ศูนย์ / ความล้มเหลวเป็นเท็จ การทำเช่นนี้ทำให้สามารถดำเนินการตามเงื่อนไขของคำสั่งเชลล์ที่ถูกล่ามโซ่
mkdir deleteme && cd $_ && pwd
นี่คือตัวอย่าง เนื่องจากเชลล์แปลความหมายว่า 0 เป็นจริงคำสั่งนี้จึงทำงานได้อย่างสะดวกตามที่คาดไว้ หากเชลล์ตีความ 0 เป็นเท็จคุณจะต้องกลับสถานะทางออกที่ตีความสำหรับแต่ละการดำเนินการ
ในระยะสั้นมันจะเป็นเรื่องไร้สาระสำหรับเชลล์ที่จะตีความ 0 เป็นเท็จเนื่องจากข้อตกลงที่ว่าแอ็พพลิเคชันส่งคืน 0 สำหรับสถานะการออกที่สำเร็จ
[* 1]: ใช่หลายครั้งการดำเนินการจำเป็นต้องส่งคืนมากกว่าข้อความแสดงความสำเร็จธรรมดา ๆ แต่อยู่นอกเหนือขอบเขตของชุดข้อความนี้
โปรดดูภาคผนวก Eในคู่มือ Bash-Scripting ขั้นสูง