Score:4

วิธีซ่อนผลลัพธ์ของคำสั่งแรกเมื่อใช้ || ตัวดำเนินการและทางออก?

ธง cn

สิ่งนี้จะซ่อนเอาต์พุตจากคำสั่งแรกและพิมพ์ อ๊ะ เพื่อ stderr ถ้ามันล้มเหลว จนถึงตอนนี้ดีมาก

#!/usr/bin/env ทุบตี
คำสั่งไม่ถูกต้อง > /dev/null 2>&1 || >&2 echo "อ๊ะ"
ก้องสวัสดี

ผลลัพธ์ที่ได้คือ:

อ๊ะ
สวัสดี

แต่ฉันต้องออกและพิมพ์ข้อความหากคำสั่งแรกล้มเหลว ผมจึงลองใช้วงเล็บ

#!/usr/bin/env ทุบตี
คำสั่งไม่ถูกต้อง > /dev/null 2>&1 || ( >&2 echo "อ๊ะ" ; exit )
ก้องสวัสดี

นี่คือผลลัพธ์ของสิ่งนั้น:

อ๊ะ
สวัสดี

แต่ตอนนี้ ทางออก ใช้งานไม่ได้เพราะทำใน subshell ทำให้พิมพ์ สวัสดีแม้ว่าฉันต้องการให้สคริปต์ออก

ดังนั้นฉันจะทำให้ Bash ไปได้อย่างไร เสียงสะท้อน ข้อความบางส่วนและออกหากคำสั่งเฉพาะล้มเหลวโดยใช้ || โอเปอเรเตอร์? ฉันรู้ว่าฉันสามารถใช้ไฟล์ ถ้า หนึ่งซับเพื่อทำอย่างนั้น แต่ฉันไม่ต้องการใช้แบบเต็ม ถ้า ถ้อยแถลงหากฉันสามารถหลีกเลี่ยงได้

#!/usr/bin/env ทุบตี
ถ้า [ "$(invalid_command > /dev/null 2>&1 ; printf $?)" != "0" ]; จากนั้น >&2 echo 'อ๊ะ' ; ทางออก 1; ไฟ
cn flag
`[` เป็นคำสั่งที่ประเมินนิพจน์และตั้งค่ารหัสทางออกของมันเองอย่างเหมาะสม ซึ่งจากนั้นคำสั่ง `if` จะถูกใช้ คุณยังสามารถเขียน `if ! คำสั่งไม่ถูกต้อง >/dev/null 2>&1; จากนั้น echo >&2 อ๊ะ; ทางออก; ฟิค
Score:9
ธง sd

ใช้ การจัดกลุ่มคำสั่ง (สังเกตุ ; ในตอนท้ายของ ทางออก).

#!/usr/bin/env ทุบตี
คำสั่งไม่ถูกต้อง > /dev/null 2>&1 || { >&2 echo "อ๊ะ" ; ทางออก; }
ก้องสวัสดี

คืนสิ่งนี้ที่เทอร์มินัลของฉัน

$ ./test.sh 
อ๊ะ

หากคุณมีคำสั่ง lot คุณสามารถดักจับข้อผิดพลาดทั้งหมดได้

#!/usr/bin/env ทุบตี
on_error() {
    >&2 echo "อ๊ะ"
    ทางออก 1
}
กับดัก 'on_error' ERR
คำสั่งไม่ถูกต้อง > /dev/null 2>&1
ก้องสวัสดี

สิ่งนี้จะพิมพ์ อ๊ะ และออกทันทีหากคำสั่งใด ๆ บนสคริปต์ล้มเหลว

โพสต์คำตอบ

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