ฉันต้องการเชลล์สคริปต์ของฉันล้มเหลวเมื่อใดก็ตามที่คำสั่งดำเนินการกับพวกเขาล้มเหลว
โดยทั่วไปแล้วฉันจะทำกับ:
set -e
set -o pipefail
(ฉันมักจะเพิ่มset -u
ด้วย)
สิ่งนี้คือไม่มีสิ่งใดในข้างต้นที่ใช้ได้กับการทดแทนกระบวนการ รหัสนี้พิมพ์ว่า "ok" และออกโดยมีรหัสส่งคืน = 0 ในขณะที่ฉันต้องการมันล้มเหลว:
#!/bin/bash -e
set -o pipefail
cat <(false) <(echo ok)
มีอะไรที่เทียบเท่ากับ "pipefail" แต่สำหรับการทดแทนกระบวนการ? วิธีอื่นใดในการส่งผ่านคำสั่งเอาต์พุตของคำสั่งเหมือนกับเป็นไฟล์ แต่การเพิ่มข้อผิดพลาดเมื่อใดก็ตามที่โปรแกรมเหล่านั้นล้มเหลว?
วิธีแก้ไขปัญหาของคนจนจะตรวจพบว่าคำสั่งเหล่านั้นเขียนไปยัง stderr (แต่บางคำสั่งเขียนไปยัง stderr ในสถานการณ์ที่ประสบความสำเร็จ)
อีกโซลูชันที่สอดคล้องกับ posix จะใช้ชื่อ pipes แต่ฉันจำเป็นต้อง lauch คำสั่งเหล่านั้น - ใช้ - กระบวนการแทน - เป็น oneliners สร้างขึ้นทันทีจากรหัสรวบรวมและสร้างไปป์ชื่อจะซับซ้อนสิ่ง (คำสั่งพิเศษข้อผิดพลาดในการดักจับสำหรับ ลบออก ฯลฯ )
$$
ทดแทนไม่ได้ผลสำหรับฉันเนื่องจากการแทนที่คำสั่ง ths ไม่ได้ทำตามคำสั่งที่ใช้การทดแทนกระบวนการเสร็จภายในท่อส่งคำสั่งที่เกิดจากรหัส "ไม่ใช่เปลือก" (python) อาจเป็นไปได้ว่าฉันควรสร้าง subprocess ในไพ ธ อนและไพพ์ไปตามโปรแกรม
kill -2 0
ดังนั้นการใช้งาน
mkfifo pipe; { rm pipe; cat <file; } >pipe
พิจารณา คำสั่งนั้นจะค้างไว้จนกว่าตัวอ่านจะเปิดขึ้นpipe
เพราะมันเป็นเชลล์ที่ทำopen()
เช่นนั้นทันทีที่มีตัวอ่านบนpipe
ลิงก์ fspipe
เป็นrm
'd จากนั้นก็cat
คัดลอก infile ออกไปยัง descriptor ของเชลล์สำหรับไพพ์นั้น และถ้าคุณต้องการที่จะเผยแพร่ข้อผิดพลาดออกจากกระบวนการย่อย: <( ! : || kill -2 "$$")