หากฉันใช้trap
เช่นอธิบายไว้ในhttp://linuxcommand.org/wss0160.php#trapเพื่อจับ ctrl-c (หรือคล้ายกัน) และการล้างข้อมูลก่อนออกจากนั้นฉันจะเปลี่ยนรหัสออกที่ส่งคืน
ตอนนี้อาจจะไม่สร้างความแตกต่างในโลกแห่งความเป็นจริง (เช่นเพราะรหัสออกไม่ได้พกพาและด้านบนของที่ไม่โปร่งใสตลอดเวลาตามที่กล่าวไว้ในรหัสทางออกเริ่มต้นเมื่อกระบวนการสิ้นสุดลง? ) แต่ฉันสงสัยว่ามี จริงๆแล้วไม่มีวิธีในการป้องกันและส่งคืนรหัสข้อผิดพลาดเริ่มต้นสำหรับสคริปต์ที่ถูกขัดจังหวะแทนหรือไม่
ตัวอย่าง (เป็น bash แต่คำถามของฉันไม่ควรพิจารณาเฉพาะ bash):
#!/bin/bash
trap 'echo EXIT;' EXIT
read -p 'If you ctrl-c me now my return code will be the default for SIGTERM. ' _
trap 'echo SIGINT; exit 1;' INT
read -p 'If you ctrl-c me now my return code will be 1. ' _
เอาท์พุท:
$ ./test.sh # doing ctrl-c for 1st read
If you ctrl-c me now my return code will be the default for SIGTERM.
$ echo $?
130
$ ./test.sh # doing ctrl-c for 2nd read
If you ctrl-c me now my return code will be the default for SIGTERM.
If you ctrl-c me now my return code will be 1. SIGINT
EXIT
$ echo $?
1
(แก้ไขเพื่อลบเพื่อให้สอดคล้องกับ POSIX มากขึ้น)
(แก้ไขอีกครั้งเพื่อให้เป็นสคริปต์ทุบตีแทนคำถามของฉันไม่ได้เฉพาะเชลล์)
แก้ไขเพื่อใช้พกพา "INT" สำหรับกับดักเพื่อประโยชน์ของ "SIGINT" ที่ไม่พกพา
แก้ไขเพื่อลบเครื่องหมายปีกกาที่ไร้ประโยชน์และเพิ่มวิธีแก้ปัญหาที่อาจเกิดขึ้น
ปรับปรุง:
ฉันแก้ไขมันตอนนี้โดยเพียงแค่ออกด้วยรหัสข้อผิดพลาดบางอย่างที่ฮาร์ดโค้ดและดักจับ EXIT นี่อาจเป็นปัญหาในบางระบบเพราะรหัสข้อผิดพลาดอาจแตกต่างกันหรือกับดัก EXIT เป็นไปไม่ได้ แต่ในกรณีของฉันมันก็โอเคพอแล้ว
trap cleanup EXIT
trap 'exit 129' HUP
trap 'exit 130' INT
trap 'exit 143' TERM
read -p
อ่านข้อมูลจากกระบวนการร่วมปัจจุบัน
read
จะอ่านจาก coprocess ปัจจุบันและจะไม่ทำงานตามมาตรฐานบอกว่าคุณควรจะใช้trap cmd SIGINT
trap cmd INT