해당 애플리케이션 빌드 스크립트를 트리거하는 입력 기반 bash 스크립트를 작성하려고 합니다. 입력이 "all"이면 모든 애플리케이션이 호출됩니다. 여기서 문제가 발생합니다. 입력이 "all"이면 app_1과 app_2만 호출됩니다. 무엇이 문제가 될 수 있나요?
if [ "${_BUILD_MODE}" = "all" ] || [ "${_BUILD_MODE}" = "app_1" ]
then
echo "BUILD_STAGE APP_1 build started"
fi
if [ "${_BUILD_MODE}" = "all" ] || [ "${_BUILD_MODE}" = "app_2" ]
then
echo "BUILD_STAGE APP_2 build started"
fi
if [ "${_BUILD_MODE}" = "all" ] || [ "${_BUILD_MODE}" = "app_3" ]
then
echo "BUILD_STAGE APP_3 build started"
fi
if [ "${_BUILD_MODE}" = "all" ] || [ "${_BUILD_MODE}" = "app_4" ]
then
echo "BUILD_STAGE APP_4 build started"
fi
if [ "${_BUILD_MODE}" = "all" ] || [ "${_BUILD_MODE}" = "app_5" ]
then
echo "BUILD_STAGE APP_5 build started"
fi
if [ "${_BUILD_MODE}" = "all" ] || [ "${_BUILD_MODE}" = "app_6" ]
then
echo "BUILD_STAGE APP_6 build started"
fi
답변1
여기에 제공한 샘플 코드에서는 이런 일이 발생하지 않습니다. 아마도 이러한 echo
s는 수행 중인 더 복잡한 작업에 대한 자리 표시자일 뿐이며, 내 생각에는 작업이 실제로 app_2
값을 변경하는 것 같습니다 $_BUILD_MODE
.
여기에서 다음을 수행할 수 있습니다.
case $_BUILD_MODE in
(all | app_1) task for app_1 ;;&
(all | app_2) task for app_2 ;;&
(all | app_3) task for app_3 ;;&
...
esac
이렇게 하면 길이가 더 짧고 깔끔해지며, $_BUILD_MODE
처음에 한 번만 역참조되므로 이 특정 문제도 피할 수 있습니다.
;;&
위의 내용은 bash에만 적용됩니다. zsh 및 mksh에서 동등한 구문은 with 입니다 ;|
. zsh, mksh 및 bash 지원 ;;
(유일한 표준 쉘인 Bourne 쉘에서) 및 ;&
(Korn 쉘에서).
app_2
작업을 호출 exit
하거나 exec some-other-command
치명적인 오류가 발생하거나 셸 프로세스가 종료될 수도 있습니다. 이 문제에 대한 해결책은 서브쉘을 (...)
.
bash -o xtrace
(same as)를 사용하여 스크립트를 실행 bash -x
하고 무슨 일이 일어나는지 확인하십시오.
1 예를 들어, 내장 기능이 손상된 파이프에 쓰는 경우 SIGPIPE를 통해, 특정 리소스 제한이 초과된 경우 SIGXCPU를 통해...
답변2
실제로 질문하는 내용은 아니지만 체인이 여기에 있더라도 일부 코드를 반복할 때 체인이 어색해 보이는 경우입니다 [ "${_BUILD_MODE}" = "all" ]
.
대신 작업을 함수에 넣고 해당 이름으로 배열을 만듭니다(테스트되지 않음).
app_1() {
echo "BUILD_STAGE APP_1 build... "
}
app_2() {
echo "BUILD_STAGE APP_2 build... "
}
tasks=(app_1 app_2)
for task in "${tasks[@]}"; do
if [ "${_BUILD_MODE}" = "all" ] || [ "${_BUILD_MODE}" = "$task" ]; then
"$task"
fi
done
함수 이름은 여기에서 사용된 작업 이름과 동일해야 합니다 _BUILD_MODE
.
여기서 작업을 서브셸로 래핑하는 등 작업 실행 방식을 변경해야 하는 경우스티븐이 제안한다, 또는 일부 인쇄물을 추가하여 분리하는 경우 루프의 한 지점에서 이 작업을 수행할 수 있습니다.