Как запустить несколько скриптов внутри скрипта, даже если один скрипт не работает

2930
Dave

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

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

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

0
То, что вы показываете, не означает, что основной сценарий должен умереть. Что стоит за «…»? glenn jackman 10 лет назад 2
Если команда "./update_artifact1.sh $ ARTIFACT_VERSION" завершится неудачно, другие две команды ("./update_artifact2.sh $ ARTIFACT_VERSION" и "./update_artifact3.sh $ ARTIFACT_VERSION") не будут выполнены. Вы понимаете? Dave 10 лет назад 0
Да. Но если вы попробуете `cd / unknown_dir; echo ok`, команда echo выполнена, хотя cd не выполнен. ** Почему ** 2-я и 3-я команды терпят неудачу в вашем скрипте? Вы включили `set -e`? 2-я и 3-я команды полагаются на то, что дает 1-я? Есть ли ошибка на выходе? Вам необходимо предоставить больше информации. glenn jackman 10 лет назад 3

1 ответ на вопрос

0
Hastur

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

#!/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не равен 01.
  • Важно то ! в первой строке, когда вам нужно написать, #!/bin/bashчтобы сказать системе, что это скрипт, который должен быть выполнен в bashоболочке.
    Вы можете найти интересную информацию о Шебанге здесь.
  • Как отмечалось и в комментарии, если вы поместите set -eгде-нибудь в свой сценарий перед этой строкой, сценарий будет прерван при первой ошибке, не обрабатывая другую строку, и вернет код ошибки (один из последней выполненной команды).