Score:5

ฉันจะตรวจสอบได้อย่างไรว่าคำสั่งล้มเหลว... ด้วยไพพ์?

ธง cn

ดังนั้นฉันจึงมีสคริปต์ดังนี้:

บางคำสั่ง | grep --invert-match บางอย่าง

ฉันต้องการเรียกใช้คำสั่งอื่นแบบมีเงื่อนไขหาก คำสั่งบางอย่าง ล้มเหลว นี่คือสิ่งที่ฉันพยายาม:

บางคำสั่ง | grep --invert-match บางอย่าง || {
    ก้อง 'อ๊ะ'
}

แต่นั่นไม่ได้ผล (the เกรป ไม่ถูกประหารชีวิต) วิธีที่เหมาะสมในการทำเช่นนี้คืออะไร?

hr flag
บางทีคุณอาจใช้อาร์เรย์ `PIPESTATUS` ของ bash: ดูตัวอย่าง [Get exit status of process that's piped to another](https://unix.stackexchange.com/a/14276/65304)
be flag
เมื่อคุณใช้ไพพ์ `grep` จะเริ่มทำงาน *ก่อน* คุณจะต้องรู้ว่า `somecommand` ล้มเหลวหรือไม่ คุณต้องการให้เอาต์พุตของคำสั่งอื่นไปที่ `grep` ด้วยหรือไม่ `{ คำสั่งบางอย่าง || { echo อ๊ะ; }; } | เกรป ...`.
Score:10
ธง cn

@สตีลไดรฟเวอร์ กล่าวถึงในความคิดเห็น นั่น พิเพสเตตัส อาจใช้งานได้ ฉันลองแล้วและใช้งานได้ดี นี่คือสิ่งที่ฉันทำ:

บางคำสั่ง | grep --invert-match บางอย่าง
ถ้า [ "${PIPESTATUS[0]}" != "0" ]; แล้ว
    ก้อง 'อ๊ะ'
ไฟ

มันรันคำสั่งเหมือนเมื่อก่อน แต่ฉันมี ถ้า คำสั่งเพื่อดูที่ พิเพสเตตัส อาร์เรย์ ฉันสนใจแค่องค์ประกอบแรกเท่านั้น นั่นคือสิ่งที่ฉันมอง ฉันตรวจสอบว่ามันล้มเหลว (หากรหัสทางออกไม่ใช่ 0) และมันก็ล้มเหลว วิ่ง ก้อง 'อ๊ะ'

in flag
ใช้งานได้โดยไม่คำนึงถึง `set -o pipefail` หรือไม่
cocomac avatar
cn flag
@ PedroA ฉันไม่รู้ว่ามันทำอะไร หากคุณลอง คุณสามารถแก้ไขคำตอบของฉันหรือโพสต์ของคุณเองก็ได้
eckes avatar
cn flag
ใช่ มันใช้งานได้กับ pipefail แต่ไม่ใช่กับ `set -e -o pipefail` เพราะมันจะไม่ถึง if
Score:7
ธง us

อีกวิธีหนึ่งขึ้นอยู่กับลักษณะการทำงานที่ต้องการคือการใช้ เดอะ ท่อล้มเหลว ตัวเลือก:

สถานะทางออกของไปป์ไลน์คือสถานะทางออกของคำสั่งสุดท้าย ในท่อส่งเว้นแต่ ท่อล้มเหลว เปิดใช้งานตัวเลือก (ดู ชุด บิ้วอิน). ถ้า ท่อล้มเหลว ถูกเปิดใช้งาน สถานะการส่งคืนของไปป์ไลน์คือค่าของ คำสั่งสุดท้าย (ขวาสุด) เพื่อออกจากสถานะที่ไม่ใช่ศูนย์หรือศูนย์ หากคำสั่งทั้งหมดออกสำเร็จ

ดังนั้นหากคุณไม่สนใจว่า คำสั่งบางอย่าง หรือ เกรป ล้มเหลว ตราบใดที่หนึ่งในนั้นล้มเหลว:

ตั้งค่า -o ท่อล้มเหลว
ถ้า ! บางคำสั่ง | grep --invert-match บางสิ่งบางอย่าง; แล้ว
    ก้อง 'อ๊ะ'
ไฟ

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา