Как отобразить последнюю команду, которая не удалась при использовании bash set -e?
Я использую set -e, чтобы остановить выполнение script при первой ошибке.
Проблема в том, что это не говорит мне, что пошло не так.
Как обновить bash script, чтобы он отображал мне последнюю неудачную команду?
Ответ 1
Вместо set -e используйте ловушку ERR; вы можете передать $BASH_LINENO in, чтобы получить номер конкретной строки, на которой произошла ошибка. Я предлагаю script воспользоваться этим в своем ответе на fooobar.com/questions/35586/...
Подводя итог:
error() {
local sourcefile=$1
local lineno=$2
# ...logic for reporting an error at line $lineno
# of file $sourcefile goes here...
}
trap 'error "${BASH_SOURCE}" "${LINENO}"' ERR
Ответ 2
Вы пробовали с помощью --verbose?
bash --verbose script.sh
Ответ 3
Вы не можете использовать set -e самостоятельно, потому что обработка будет немедленно остановлена после любой ошибки. Взгляните на "Установить раздел встроенного" справочного руководства Bash для получения дополнительной информации о параметрах -x и -v, которые вы можете использовать для отладки.
Что-то вроде:
set -e
set -v
выйдет из любой ошибки, показывая каждую строку ввода, когда она читается. Однако он не покажет вам только строку с ошибкой. Для этого вам нужно будет выполнить свою собственную явную проверку ошибок.
Например:
set +e
if false; then
real_exit_status=$?
echo 'Some useful error message.' >&2
exit $real_exit_status
fi
Ответ 4
set -ex будет показывать (все) строки по мере их выполнения и останавливаться при первой команде, возвращающей ненулевое значение (не как часть конструкций if/while/until).
Ответ 5
сделать err.sh
set -e
trap 'echo "ERROR: $BASH_SOURCE:$LINENO $BASH_COMMAND" >&2' ERR
включить его (. err.sh) во все ваши скрипты.
заменить любой
... | while read X ; do ... ; done
с
while read X ; do ... ; done < <( ... )
в ваших сценариях для ловушки, чтобы указать правильный номер строки/команды в сообщении об ошибке