сбой сценария bash и выход при использовании неудачной операции оператора left и - PullRequest
0 голосов
/ 03 февраля 2020

Из документов, очевидно использующих set -e, недостаточно в скрипте bash, чтобы он завершился с ошибкой и завершился, когда внутри есть 2 операции, связанные с оператором &&, из которых сначала не удалось.

По сути если у меня есть: false && true внутри bash скрипта с set -e, что еще мне нужно, чтобы скрипт завершился ошибкой и завершился без продолжения?

Ответы [ 2 ]

2 голосов
/ 03 февраля 2020

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

{ false && true;} || {
   echo 1>&2 "? predicate expression failed"
   exit 1
}

Вы также можете выйти, если выражение выполнено успешно:

{ true && true;} && {
  echo "Operation complete! Exiting"
  exit 0
}

Скобки (или вы можете использовать subshell, но это менее эффективно) не являются строго необходимыми, но делают вещи немного яснее.

2 голосов
/ 03 февраля 2020

&& (и даже if) были бы бесполезны, если бы set -e вел себя таким образом.

Рассмотрим следующий код в контексте, где errexit означает , а не включено :

check_if_we_need_foo && do_foo
proceed_with_other_stuff

... что близко к:

if check_if_we_need_foo; then
  do_foo
fi
proceed_with_other_stuff

Если set -e вел себя так, как вы просите, путь к коду, где check_if_we_need_foo возвращает false, do_foo пропускается, и тогда proceed_with_other_stuff случается было бы невозможно записать , потому что любой ложный статус выхода (даже тот, который означал бы логическое ложное значение, а не ошибку) заставил бы скрипт немедленно завершиться.

Более того, && не будет иметь никакого значения, отличного от значения ; или новой строки!

Что хорошего в if, где ветвь true является единственной версией, которая не приводит к немедленному выходу?


Таким образом, set -e не влияет на состояние выхода «проверенных» команд.

Если вы хотите различить guish между ошибкой (которая должна вызывать выход) и логической ложью (которая должна вызывать ветвь else в if, или в случае &&, содержимое с правой стороны не должно выполняться), вам нужно написать этот код самостоятельно, проверив состояние выхода соответствующим образом (при условии, что они различимы). Если они не различимы, есть ваш ответ - сделать различие невозможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...