여러 단계 쉘을 동시에 호출하는 메인 쉘을 만들었습니다.
#!/bin/bash
##I'm the master shell and I'm super important. I should never fail to log.
bash ./step1.sh
bash ./step2.sh
bash ./step3.sh
bash ./step4.sh
...
다음 셸을 호출하기 전에 단계 셸이 실패해서는 안 됩니다.
저는 이를 수행하는 3가지 방법을 생각하고 있지만 실제로는 그 방법이 정확히 무엇인지 모릅니다.
방법 1)
bash ./step1.sh &&
bash ./step2.sh &&
bash ./step3.sh &&
bash ./step4.sh &&
...
방법 2)
bash ./step1.sh
if [ $? -eq 0 ]; then
bash ./step2.sh
fi
if [ $? -eq 0 ]; then
bash ./step3.sh
fi
if [ $? -eq 0 ]; then
bash ./step4.sh
fi
...
방법 3)
set -e
bash ./step1.sh
bash ./step2.sh
bash ./step3.sh
bash ./step4.sh
...
set +e
스크립트 중 하나가 실패하면 즉시 종료할 기본 스크립트가 필요 step
하고 실패한 단계를 기록할 수 있어야 합니다.
어느 것이 가장 선호되고 어느 것이 가장 안전합니까?
답변1
"가장 안전한" 동작은 제쳐두고 어떤 동작이 "안전하고" "바람직한" 것인지는 스크립트가 수행하는 작업을 모르는 것이라고 말한 적이 없으므로 원하는 작업을 달성하는 "더 나은" 방법이 있을 수 있습니다.
set -e
기본 스크립트를 종료하기 전에 개별 단계 중 하나에서 실패를 기록해야 하기 때문에 실제로 아래 체인의 단계나 이러한 단계 사이의 단계를 실행할 수는 없습니다 &&
. 즉, step
스크립트 자체가 실패를 기록하지 않는 한입니다.
기본 스크립트가 실패를 기록해야 한다고 가정해 보겠습니다. 기본 스크립트는 다음 스크립트를 실행하고 실패를 감지할 수 있어야 합니다. 그런 다음 종료하기 전에 사용자에게 이 오류를 알려야 합니다.
나는 아마도 두 번째 접근 방식의 변형을 선택할 것입니다.
#!/bin/bash
for step in {1..4}; do
if ! bash "./step$step.sh"; then
printf 'Step %s failed, terminating...\n' "$step" >&2
exit 1
fi
done
echo 'All done, no failures'
이 루프는 정수 1부터 4까지 반복하고 각 반복마다 적절한 스크립트를 실행합니다. 스크립트가 실패하면 사용자에게 진단 메시지를 기록하고 0이 아닌 종료 상태로 종료됩니다.
정수를 반복하는 대신 분명히 사용할 수 있습니다.
#!/bin/sh
for script in ./step*.sh; do
if ! bash "$script"; then
printf 'Script "%s" failed, terminating...\n' "$script" >&2
exit 1
fi
done
echo 'All done, no failures'
...실제 단계 스크립트를 반복합니다(파일 이름 글로빙에서 반환된 순서대로 반환). 또는
#!/bin/bash
for script in ./step{1..4}.sh; do
if ! bash "$script"; then
printf 'Script "%s" failed, terminating...\n' "$script" >&2
exit 1
fi
done
echo 'All done, no failures'
스크립트의 정확한 순서를 더 잘 제어할 수 있습니다(특히 스크립트가 9개 이상인 경우).