Мне кажется, что это описаниеset -e
:
The shell does not exit if the command that fails is... part of any command executed in a && or || list
вольно интерпретирует «часть списка &&» как включение каждой команды в вызов функции. В результате даже простая неудачная команда внутри функции не вызывает ловушку ERR --, когда она вызывается в цепочке &&
.
Если вам нужно остановить выполнение команд функции при сбое одной из них, можно объединить их все в цепочку в блоке:
first-step-fails() {
{
true &&
false &&
true;
} || exit 1
echo "A is executed.";
}
first-step-fails && echo "B is executed.";
... приводит к отсутствию вывода и возврату -кода 1.