Как я могу показать сообщение об ошибке для определенной команды, если сценарий bash завершается из-за set -e

Я хочу отобразить строку журнала ошибок для одной конкретной команды, когда ее возвращаемое значение не равно нулю. Я использую 'set -e' для завершения, если какая-либо команда возвращает ненулевое значение вместе с 'trap' для этого

  #!/bin/bash
    set -e

    log_report() {
        echo "Error on line $1"
    } 

    trap 'log_report $LINENO' ERR

    echo "starting ..."
    first_badcommand
    echo "running"
    second_badcommd

ВЫХОД:

starting ...
/tmp/test1.sh: line 10: first_badcommand: command not found
Error on line 10

так как я использую set -e для выхода из скрипта и показываю свой журнал ошибок для first_badcommand.. самого себя. Я хочу выйти с журналом ошибок только для конкретной команды, дающей ненулевой код возврата, и для остальных команд, дающих ненулевой код возврата, выйти без журнала ошибок


person Pratheesh    schedule 11.06.2020    source источник
comment
Как это возможно? ожидается, что сценарий завершится при первом ненулевом коде. Вы не можете обойти это   -  person Inian    schedule 11.06.2020
comment
звучит так, как будто мой вопрос вводит в заблуждение. Нет проблем, если скрипт завершит работу по команде first_bad. Моя проблема заключается в том, чтобы отображать журнал ошибок только тогда, когда second_badcommad возвращает ненулевой код возврата. Теперь журнал ошибок отображается для любой команды с ненулевым кодом возврата.   -  person Pratheesh    schedule 11.06.2020


Ответы (2)


После уточнения выясняется, что требуется выйти из сценария в случае возникновения какой-либо ошибки, но что команды, описанные в вопросе как «плохая команда», могут или не могут завершиться ошибкой.

В этом ответе я называю команды просто first_command и т. д., чтобы отразить тот факт, что они могут или не могут дать сбой.

Команда set -e, как предложено в вопросе, действительно завершит сценарий в случае возникновения ошибки, а trap ... ERR установит обработчик, который будет запускаться после ошибки (и до выхода сценария, где использовался set -e).

В этом случае вам следует:

  • подождите, пока ловушка не потребуется, прежде чем устанавливать ее (это не нужно делать в/рядом с началом скрипта)

  • снова отключите ловушку, когда она больше не нужна, используя trap - ERR

чтобы команды для включения и отключения ловушки окружали команду, для которой требуется ловушка.

Например:

#!/bin/bash

set -e

log_report() {
    echo "Error on line $1"
} 

echo "starting ..."
first_command

trap 'log_report $LINENO' ERR

echo "running"
second_command

trap - ERR

echo "still running"
third_command

Это завершится, если какая-либо команда завершится ошибкой (из-за set -e вверху), но ловушка будет запущена только в случае ошибки second_command.

(Обратите также внимание, что set -e аналогичным образом не нужно применять в начале скрипта. Его можно включить в любой момент и снова отключить с помощью set +e. Но в этом примере кажется, что выход-при-ошибке во всем требуется поведение.)

person alani    schedule 11.06.2020
comment
, Альтернативный метод будет продолжать работать, даже если first_badcommand завершится ошибкой. Мое требование - выйти из сценария без журнала ошибок, если произойдет какая-либо ошибка. выйдите из скрипта с журналом ошибок, если произойдет second_badcommand - person Pratheesh; 11.06.2020
comment
@Pratheesh Я думаю, что несколько человек были сбиты с толку требованиями. Хорошо, я снова отредактирую ответ. - person alani; 11.06.2020
comment
@Pratheesh Редактировал еще пару раз. Я надеюсь теперь понял требование. Пожалуйста, можете проверить. - person alani; 11.06.2020
comment
это сработало .. я думаю, что ввела вас всех в заблуждение .. отредактирую свой вопрос - person Pratheesh; 11.06.2020

set -e не останавливает вас от проверки состояния командной строки, которую вы в противном случае сделали бы:

if some_command
then
  echo "It succeeded"
else
  echo "It failed. Some message here."
  exit 1
fi
person that other guy    schedule 11.06.2020