서브쉘에서 오류를 억제하시겠습니까?

서브쉘에서 오류를 억제하시겠습니까?

특정 지점 이후 서브셸의 오류를 억제하고 싶습니다.

나는 이 상황을 보여주기 위해 스크립트를 작성했습니다.

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=trueif ( set -e; ...); then ... fibash

복합 명령 또는 셸 함수가 무시된 컨텍스트에서 실행될 -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

관련 정보