내가 아는 한, 대괄호는 명령이 하위 쉘에서 실행되도록 하고 중괄호는 명령을 그룹화하지만 하위 쉘에서 실행되지 않도록 합니다.
괄호를 사용하여 실행할 때:
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