Слід зазначити, що 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 )