ควรสังเกตว่าif...then...fi
และ&&
/ ||
ประเภทของวิธีการจัดการกับสถานะทางออกที่ส่งคืนโดยคำสั่งที่เราต้องการทดสอบ (0 เมื่อสำเร็จ); อย่างไรก็ตามคำสั่งบางคำสั่งจะไม่ส่งคืนสถานะการออกที่ไม่ใช่ศูนย์หากคำสั่งล้มเหลวหรือไม่สามารถจัดการกับอินพุตได้ ซึ่งหมายความว่าปกติif
และ&&
/ ||
แนวทางจะไม่ทำงานสำหรับคำสั่งเฉพาะเหล่านั้น
ตัวอย่างเช่นบน Linux GNU file
ยังคงออกด้วย 0 หากได้รับไฟล์ที่ไม่มีอยู่เป็นอาร์กิวเมนต์และfind
ไม่สามารถระบุตำแหน่งผู้ใช้ไฟล์ที่ระบุ
$ find . -name "not_existing_file"
$ echo $?
0
$ file ./not_existing_file
./not_existing_file: cannot open `./not_existing_file' (No such file or directory)
$ echo $?
0
ในกรณีเช่นนี้วิธีที่เป็นไปได้วิธีหนึ่งที่เราสามารถจัดการกับสถานการณ์ได้คือการอ่านstderr
/ stdin
ข้อความเช่นที่ส่งคืนโดยfile
คำสั่งหรือแยกวิเคราะห์เอาต์พุตของคำสั่งเช่นfind
นี้ สำหรับวัตถุประสงค์นั้นcase
สามารถใช้ข้อความสั่งได้
$ file ./doesntexist | while IFS= read -r output; do
> case "$output" in
> *"No such file or directory"*) printf "%s\n" "This will show up if failed";;
> *) printf "%s\n" "This will show up if succeeded" ;;
> esac
> done
This will show up if failed
$ find . -name "doesn'texist" | if ! read IFS= out; then echo "File not found"; fi
File not found
(นี่คือ repost คำตอบของฉันเองสำหรับคำถามที่เกี่ยวข้องที่ unix.stackexchange.com )