Изменено в комментариях
состояние выхода команды конвейера - это состояние выхода последней команды, его можно изменить с помощью set -o pipefail
, поэтому статус выхода конвейера будет <>0
для любой команды.статус выхода - <>0
.
Первый ответ
, так как вы использовали опцию -e
, достаточно, чтобы функция вернула код выхода, отличный от 0
, например return 1
в более общем случае (без set -e
) может быть лучше использовать явный выход
my_var=$(foo) || exit 1
может быть достаточно, поскольку ошибка может быть записана в стандартной ошибке (унаследованной) в подоболочке.
В противном случае, внимательно читая руководство, можно объяснить, почему оно не работает так, как вы ожидали
set -e
Выйти немедленно, если [...] вернет aненулевой статус.Оболочка не завершает работу, если сбойная команда является частью списка команд, следующих сразу за ключевым словом некоторое время или до, часть теста в операторе if, часть любой команды, выполняемой в && или ||список, за исключением команды, следующей за последним символом && или ||, [...].
Этот параметр применяется к среде оболочки и каждой среде подоболочки отдельно (см. Среду выполнения команд) и может привести к выходу подоболочек довыполнение всех команд в подоболочке.
[...]
И из среды выполнения команд
Подоболочки, порожденные для выполнения подстановок команд, наследуютзначение параметра -e из родительской оболочки.Когда Bash не находится в режиме POSIX, в таких подоболочках параметр -e очищается.