ฉันกำลังพยายามสั่ง GNU ทำให้ 3.81 ไม่หยุดถ้าคำสั่งล้มเหลว (ดังนั้นฉันจึงนำหน้าคำสั่งด้วย-
) แต่ฉันต้องการตรวจสอบสถานะการออกจากคำสั่งถัดไปและพิมพ์ข้อความที่ให้ข้อมูลเพิ่มเติม อย่างไรก็ตาม Makefile ของฉันด้านล่างล้มเหลว:
$ cat Makefile
all:
-/bin/false
([ $$? -eq 0 ] && echo "success!") || echo "failure!"
$
$ make
/bin/false
make: [all] Error 1 (ignored)
([ $? -eq 0 ] && echo "success!") || echo "failure!"
success!
เหตุใด Makefile ด้านบนจึงแสดงว่า "สำเร็จ!" แทนที่จะเป็น "ความล้มเหลว!" ?
อัปเดต:
การติดตามและขยายคำตอบที่ได้รับการยอมรับด้านล่างเป็นวิธีการเขียน:
failure:
@-/bin/false && ([ $$? -eq 0 ] && echo "success!") || echo "failure!"
success:
@-/bin/true && ([ $$? -eq 0 ] && echo "success!") || echo "failure!"
.SHELLFLAGS = -ec
ควรใช้ แต่ในกรณีนี้คุณไม่สามารถใช้-
คำนำหน้าเพิ่มเติมได้ (สำหรับคำสั่งส่วนตัวของใบเสร็จ) เพราะการทำจะเขียนข้อผิดพลาดนั้นจะถูกละเว้น แต่ก็จะยังคงบล็อกทั้งหมดล้มเหลว ดังนั้น|| :
เป็นหนึ่งในวิธีการแก้คำสั่งที่จะไม่สนใจ แต่มันไม่ใช่ข้ามแพลตฟอร์ม (Windows มี|| :
หรือไม่|| true
)
.ONESHELL:
คำสั่ง