특정 지점 이후 서브셸의 오류를 억제하고 싶습니다.
나는 이 상황을 보여주기 위해 스크립트를 작성했습니다.
worked=false
(echo Starting subshell process \
&& echo If this executes process is considered success \
&& false \
&& echo run if possible, but not an error if failed) \
&& worked=true
echo $worked
프로세스가 작동하는지 쉘에 보고하고 싶습니다.
또한 작업 변수를 서브셸에 넣는 것도 고려했습니다.
&& echo This works process worked: \
&& worked=true \
&& false \
&& echo run if possible, but not an error if failed)
그러나 이 방법도 작동하지 않습니다. 왜냐하면 서브셸 내부에 변수를 설정해도 기본 스크립트에는 영향을 주지 않기 때문입니다.
답변1
이건 어때
worked=false
(
set -e
echo Starting subshell process
echo If this executes process is considered success
false
echo run if possible, but not an error if failed || true
)
[[ 0 -eq $? ]] && worked=true
echo "$worked"
set -e
보호되지 않은 오류가 발견되면 서브쉘이 종료됩니다. 이 || true
구성은 실패할 수 있는 명령문을 보호하고 서브쉘이 종료되는 것을 원하지 않습니다.
서브쉘이 성공했는지 알고 싶다면 $worked
이 변수를 완전히 생략 할 수 있습니다.
(
set -e
...
)
if [[ 0 -eq $? ]]
then
echo "Success"
fi
명령이 실패할 경우 서브셸에서 실행을 즉시 중단 하려면 또는 같은 구문을 set -e
사용할 수 없습니다 . 이것은 매뉴얼 페이지에 문서화되어 있지만 처음에는 놓쳤습니다.( set -e; ... ) && worked=true
if ( set -e; ...); then ... fi
bash
복합 명령 또는 셸 함수가 무시된 컨텍스트에서 실행될
-e
때 설정 되면-e
복합 명령 또는 함수 호출이 포함된 명령이 완료될 때까지 설정이 적용되지 않습니다.
답변2
worked=false
(status=1;
echo Starting subshell process \
&& echo If this executes process is considered success \
&& status=0
&& false \
&& echo run if possible, but not an error if failed;
exit $status) \
&& worked=true
echo $worked
답변3
if
모든 것을 &&
연결 하지 않고도 force 명령을 조건부로 넣을 수 있습니다 .
worked=false
( if echo Starting subshell process &&
echo If this executes process is considered success ; then
false &&
echo run if possible, but not an error if failed
exit 0
fi
exit 1 ) && worked=true
echo worked=$worked
답변4
내 해결책은 서브셸 내부에 변수를 만들고 해당 변수를 기반으로 종료 코드를 수동으로 제어하는 것이었습니다.
worked=false
(echo Starting subshell process \
&& echo If this executes process is considered success \
&& check=true \
&& false \
&& echo run if possible, but not an error if failed
if [[ -n "$check" ]]; then exit 0; else exit 1; fi) \
&& worked=true
echo $worked