Следует отметить, что 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
(Это репост моего собственного ответа на связанный вопрос на unix.stackexchange.com )