У меня есть простой сценарий Bash, который выполняет ряд других сценариев ...

#/bin/bash
…
./update_artifact1.sh $ARTIFACT_VERSION
./update_artifact2.sh $ARTIFACT_VERSION
./update_artifact3.sh $ARTIFACT_VERSION

Проблема в том, что если первая команда (или вторая) умирает с ошибкой, ни одна из последующих команд не запускается. Есть ли способ, которым я могу выполнить все три команды, сохранить состояние выхода каждой из них, а затем вернуть статус успешного завершения, если все три выполнены успешно? Скрипты не должны запускаться одновременно.

1 ответ1

0

Вы можете немного изменить свой скрипт таким образом

#!/bin/bash
…
./update_artifact1.sh $ARTIFACT_VERSION
exit_state_1=$?
./update_artifact2.sh $ARTIFACT_VERSION
exit_state_2=$?
./update_artifact3.sh $ARTIFACT_VERSION
exit_state_3=$?
exit_state_all=$[ $exit_state_1 &&  $exit_state_2 && $exit_state_3 ]
exit $exit_state_all

Замечания:

  • Каждая команда возвращает код завершения, который bash хранит в $? , Это 0 если нет ошибки, или другое число, если есть ошибка.
    После каждой строки значение $? обновляется, поэтому вам нужно сохранить переменную (в этом случае мы использовали exit_state_1 ... exit_state_n).
    В конце вы хотите, чтобы ваш скрипт возвращал вам только код ошибки с 0, если все в порядке, и мы реализуем его с помощью $[ $a || $b || $c ] .
    Обратите внимание, что $[ 0|| 0 || 0 ] равно 0, а $[ $a || $b || $c ] где хотя бы один из $a,$b,$c не равен 0 возвращает 1.
  • Важно то ! в первой строке, когда вы должны написать #!/bin/bash чтобы сказать системе, что это скрипт, который должен быть выполнен в оболочке bash .
    Вы можете найти интересную информацию о Шебанге здесь.
  • Как отмечалось и в комментарии, если вы поместите set -e где-нибудь в вашем скрипте перед этой строкой, скрипт будет прерван при первой ошибке, не обрабатывая другую строку, и вернет код ошибки (один из последней выполненной команды ).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .