set -e
довольно жестко. Попробуйте что-то вроде
trap 'err=$?;
echo >&2 "ERROR $err in $0 at line $LINENO, Aborting";
exit $err;' ERR
Это намного более информативно при чтении ваших журналов, и вы можете поместить подобную команду в подоболочку. Да, это означает добавление его в подоболочку ... но я часто делаю подобные вещи в определениях функций, которые вызываются в подоболочках. Хорошо работает.
Используется:
$ trap 'echo BOOM' ERR # parent shell trap for demo
$ false # trigger manually for demo
BOOM
$ x="$( trap 'err=$?;
> echo >&2 "ERROR $err in $0 at line $LINENO, Aborting";
> exit $err;' ERR
> date
> pwd
> false
> echo "I shan't"
> )"
ERROR 1 in bash at line 7, Aborting
BOOM
$ echo "$x"
Thu, Jan 10, 2019 8:35:57 AM
/c/Users/P2759474/repos/Old/deploy_microservices
$
Если бы внешняя оболочка имела такую же или похожую ловушку, она также прервалась бы с другим сообщением. (Обычно полезно сделать сообщения разными.)
<Ч />
Если вам это просто не нравится, то в качестве неуклюжего обходного пути вы можете перенести данные в временный файл. Вот скрипт, который сделает это.
set -ex
{ pwd
date
false
echo "will this happen?"
} > foo
x=$(<foo)
echo "$x"
Поместите это в сценарий, он успешно освобождается.
$: ./sete
+ pwd
+ date
+ false
$: echo $?
1
Я бы все еще использовал trap
, но логика работает.
Я бы также использовал mktemp
и ловушку для удаления температуры при выходе и т. Д., Но вы поняли.