การดำเนินการ(exit 1);
เป็นวิธีที่ง่ายที่สุดในการเรียกERR
กับดัก มันจะทริกเกอร์ทางออกทันทีหากset -e
มีผล (การทริกเกอร์เงื่อนไขข้อผิดพลาดจำเป็นต้องมีคำสั่งล้มเหลวexit
ด้วยค่าความล้มเหลวใน subshell ทำให้ subshell ล้มเหลว)
exit 1;
จะไม่ทำสิ่งเหล่านั้น
ดังนั้น{(exit 1); exit 1;}
สามารถใช้เพื่อสร้างERR
กับดักก่อนซึ่งอาจทำสิ่งที่มีประโยชน์สำหรับวัตถุประสงค์ในการดีบั๊กและยุติสคริปต์ด้วยตัวบ่งชี้ข้อผิดพลาด
แต่นั่นไม่ใช่สิ่งที่เกิดขึ้นในautoconf
ไฟล์ autoconf
สคริปต์พึ่งพากับEXIT
ดักเพื่อทำความสะอาดไฟล์ชั่วคราวที่สร้างขึ้นระหว่างการรัน เชลล์ส่วนใหญ่รวมถึงbash
จะตั้งค่าสถานะจากค่าที่ให้ไว้ในexit
คำสั่งก่อนที่จะเรียกEXIT
กับดัก ซึ่งอาจทำให้EXIT
แทร็บตรวจพบว่ามีการเรียกใช้จากข้อผิดพลาดหรือจากการเลิกจ้างตามปกติและยังช่วยให้มั่นใจได้ว่าสถานะทางออกถูกตั้งค่าอย่างถูกต้องในตอนท้ายของการดำเนินการกับดัก
อย่างไรก็ตามดูเหมือนว่าบางเชลล์ไม่ได้ทำงานร่วมกัน นี่คือคำพูดจากautoconf
คู่มือ :
เชลล์สคริปต์บางตัวเช่นที่สร้างโดยautoconf
ใช้กับดักเพื่อล้างข้อมูลก่อนออก หากคำสั่งเชลล์สุดท้ายออกด้วยสถานะที่ไม่ใช่ศูนย์กับดักยังออกด้วยสถานะที่ไม่ใช่ศูนย์เพื่อให้ผู้เรียกใช้สามารถบอกได้ว่าเกิดข้อผิดพลาดขึ้น
น่าเสียดายที่ในบางเชลล์เช่น Solaris /bin/sh
กับดักออกจะไม่สนใจอาร์กิวเมนต์ของคำสั่ง exit ในเชลล์เหล่านี้กับดักไม่สามารถระบุได้ว่ามันถูกเรียกใช้โดย exit ธรรมดาหรือโดย exit 1 แทนการเรียก exit โดยตรงให้ใช้AC_MSG_ERROR
แมโครที่มีวิธีแก้ปัญหาสำหรับปัญหานี้
วิธีแก้ปัญหาคือเพื่อให้แน่ใจว่า$?
มีสถานะการออกก่อนที่exit
คำสั่งจะถูกดำเนินการเพื่อที่จะมีค่านั้นอย่างแน่นอนเมื่อเรียกใช้EXIT
กับดัก และแน่นอนว่ามันเป็นAC_MSG_ERROR
มาโครที่แทรกโค้ดแปลก ๆ นั้นพร้อมกับเครื่องหมายวงเล็บซ้ำซ้อน
false
แทน(exit 1)
?