Bash는 $?를 반환하지 않습니다. 명령 출력이 지역 변수에 할당되면 변수가 올바른 것입니다.
test() {
aaa=$(eval "timeout 1s sleep 5s")
echo $? # echoes 124 (!=0 as expected)
local aaa=$(eval "timeout 1s sleep 5s")
echo $? # echoes 0
}
왜?
답변1
local
는 그 자체로 명령이므로(쉘 내장) local
명령 대체에서 파이프의 반환 값 대신 반환 값을 얻게 됩니다. 변수를 할당하기 전에 변수를 로컬로 선언하는 것을 고려할 수 있습니다. 이렇게 하면 local
명령 대체와 동일한 파이프라인에서 내장 변수가 호출되는 것을 방지하여 명령의 종료 코드가 모호해지는 것을 방지할 수 있습니다.
foo() {
local bar
bar=$(baz)
echo $?
}