Распространение кода выхода в звонящий в случае ошибки оболочки из скрипта, имеющих выходную ловушку
Вопрос
Можно ли распространить код выхода к абонеру в случае синтаксической ошибки в скрипте Bash с выходом?Например, если у меня есть:
#! /bin/bash
set -eu
trap "echo dying!!" EXIT
echo yeah
echo $UNBOUND_VARIABLE
echo boo
.
Затем запустить его, дает код выхода 0, даже если сценарий не совсем не закончился:
$ bash test.sh
yeah
test.sh: line 8: UNBOUND_VARIABLE: unbound variable
dying!!
$ echo $?
0
.
Но если я прокомментирую выходную ловушку, скрипт возвращается 1. В качестве альтернативы, если я заменил строку с несвязной переменной с помощью команды, которая возвращает ненулевой (например, /bin/false
), что значение выхода распространяется, когда я хотел бы,
Решение 2
Это поведение связано с различными версиями Bash.Оригинальный сценарий работает, как ожидалось, на Bash 4.2, но не на 3.2.Наличие прерымонов ошибок в отдельном файле скрипта и запущена его в подмененном подселении, работает вокруг проблем в более ранних версиях Bash:
#!/bin/bash
$BASH sub.sh
RETVAL=$?
if [[ "$RETVAL" != "0" ]]; then
echo "Dying!! Exit code: $RETVAL"
fi
.
sub.sh:
set -eu
echo yeah
echo $UNBOUND_VARIABLE
echo boo
. Другие советы
Оболочка выходит с результатом последней выполненной команды.В вашем случае ловушка это генеракодицетагкод, который обычно возвращается с успехом.
Чтобы распространять вашу ценность, просто генеракодицетагCode с ним.
#!/bin/bash
set -eu
die() {
echo "Dying!!"
exit "$1"
}
trap 'die $?' EXIT
echo yeah
echo $unbound
echo boo
.
Также обратите внимание, что echo
считается вредным - он заставляет вас думать, что сценарий выйдет, если команда не удалась, которую она не всегда будет делать.