Perlu dicatat bahwa if...then...fi
dan &&
/ ||
jenis pendekatan berkaitan dengan status keluar yang dikembalikan oleh perintah yang ingin kami uji (0 saat berhasil); namun, beberapa perintah tidak mengembalikan status keluar yang tidak nol jika perintah gagal atau tidak dapat menangani input. Ini berarti bahwa pendekatan biasa if
dan &&
/ ||
tidak akan bekerja untuk perintah-perintah tertentu.
Misalnya, di Linux, GNU file
masih keluar dengan 0 jika menerima file yang tidak ada sebagai argumen dan find
tidak dapat menemukan file yang ditentukan pengguna.
$ 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
Dalam kasus seperti itu, salah satu cara potensial kita dapat menangani situasi adalah dengan membaca stderr
/ stdin
pesan, misalnya yang dikembalikan dengan file
perintah, atau parse output dari perintah seperti di find
. Untuk tujuan itu, case
pernyataan dapat digunakan.
$ 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
(Ini adalah repost jawaban saya sendiri pada pertanyaan terkait di unix.stackexchange.com )