Как отобразить последнюю команду, которая не удалась при использовании bash set -e? - программирование
Подтвердить что ты не робот

Как отобразить последнюю команду, которая не удалась при использовании bash set -e?

Я использую set -e, чтобы остановить выполнение script при первой ошибке.

Проблема в том, что это не говорит мне, что пошло не так.

Как обновить bash script, чтобы он отображал мне последнюю неудачную команду?

4b9b3361

Ответ 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 < <( ... )

    в ваших сценариях для ловушки, чтобы указать правильный номер строки/команды в сообщении об ошибке