괄호가 중괄호 대신 종료 상태를 반환하는 이유

괄호가 중괄호 대신 종료 상태를 반환하는 이유

내가 아는 한, 대괄호는 명령이 하위 쉘에서 실행되도록 하고 중괄호는 명령을 그룹화하지만 하위 쉘에서 실행되지 않도록 합니다.

괄호를 사용하여 실행할 때:

no_func || (
    echo "there is nothing"
    exit 1
)

echo $?

그러면 종료 상태가 반환됩니다.

/Users/myname/bin/ex5: line 34: n_func: command not found
there is nothing
1

하지만 중괄호를 사용하면 다음과 같습니다.

no_func || {
    echo "there is nothing"
    exit 1
}

echo $?

종료 상태를 반환하지 않습니다.

/Users/myname/bin/ex5: line 34: no_func: command not found
there is nothing

그런데 왜 하나는 종료 상태를 반환하고 다른 하나는 반환하지 않습니까?

답변1

명령 실행 추적( set -x)을 확인합니다. 교정기 포함:

+ no_func
./a: line 3: no_func: command not found
+ echo 'there is nothing'
there is nothing
+ exit 1

exit(하위)쉘을 종료합니다. 중괄호는 하위 쉘을 생성하지 않으므로 exit기본 쉘 프로세스가 종료되므로 실행 지점에 도달하지 않습니다 echo $?.

답변2

중괄호를 사용하면 스크립트는 echo $?스크립트에 도달하기 전에 상태 1로 종료됩니다.

스트랩 쉘의 변형:

$ ./script1.sh
./script1.sh: line 3: no_func: command not found
there is nothing 
1 # <-- exit status of subshell
$ echo $?
0 # <-- exit status of script

중괄호가 있는 변형:

$ ./script2.sh
./script2.sh: line 3: no_func: command not found
there is nothing # <-- the script exits with 1 after this line
$ echo $?
1 # <-- exit status of script

관련 정보