Не знаете, как отправить код ошибки, если команда внутри скрипта завершится неудачно - PullRequest
0 голосов
/ 04 июня 2019

Недавно я узнал об операторе if, который просматривает предыдущую команду и в случае неудачи отправит код выхода 1 с сообщением. Я не могу вспомнить все утверждение, но оно начинается с приведенного ниже:

if [ $? != "0" ]

Чем заканчивается это утверждение? Это следует за каждой командой в сценарии?

1 Ответ

1 голос
/ 04 июня 2019

Не делай этого.Явная ссылка на $? почти никогда не нужна.Если вы хотите выйти со статусом 1 в случае сбоя команды, вы можете просто сделать:

cmd || exit 1

Если вы хотите выйти с тем же ненулевым значением, возвращенным командой, вы можете просто сделать:

cmd || exit

Существует множество примеров плохого кода, который вместо этого выполняет такие вещи, как:

cmd
if [ "$?" -ne 0 ]; then echo cmd failed >&2; exit 1; fi

, и по многим причинам это плохая практика.Нет смысла заставлять оболочку печатать общее сообщение об ошибке;Сама команда должна была уже написать подробное сообщение об ошибке, и смутное «cmd fail» - просто шум линии.Кроме того, вы часто будете видеть set -e, который в основном шлепает || exit в конце каждой простой команды, но имеет много непреднамеренных побочных эффектов и крайних случаев, и его реализация менялась на протяжении истории и разных версий одной и той же оболочкибудет по-разному обрабатывать граничные случаи, поэтому использовать его на самом деле не очень хорошая идея.

Что касается вопроса "чем заканчивается это утверждение?";заканчивается fi.Общая форма if - это if CMD; then ...; else ...; fi, где CMD - это некоторый набор конвейеров (например, вы можете сделать if echo foo | grep bar; cmd2 | foo; then ....).Если CMD возвращает статус 0, выполняется первый набор команд (между «then» и «else»).Если CMD возвращает ненулевое значение, команды между «else» и «fi» выполняются.Предложение else не является обязательным.Не обманывайтесь [;это просто команда.На мой взгляд, было бы более понятно, если бы вы использовали его альтернативное написание test, которое не требует окончательного аргумента ].IOW, вы могли бы написать if test "$?" -ne 0; then ...; fi.

...