&&
(и даже 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, или в случае &&
, содержимое с правой стороны не должно выполняться), вам нужно написать этот код самостоятельно, проверив состояние выхода соответствующим образом (при условии, что они различимы). Если они не различимы, есть ваш ответ - сделать различие невозможно.