출구 트랩을 갖는 스크립트에서 쉘 오류가 발생할 경우 발신자에게 종료 코드 전파
문제
은 종료 트랩이있는 Bash 스크립트에서 구문 오류가 발생할 경우 종료 코드를 호출자에게 전파 할 수 있습니까?예를 들어, 내가 가지고있는 경우 :
#! /bin/bash
set -eu
trap "echo dying!!" EXIT
echo yeah
echo $UNBOUND_VARIABLE
echo boo
.
그런 다음 스크립트가 실제로 성공적이지 않은 경우에도 종료 코드 0을 제공합니다.
$ bash test.sh
yeah
test.sh: line 8: UNBOUND_VARIABLE: unbound variable
dying!!
$ echo $?
0
.
그러나 종료 트랩을 주석 처리하면 스크립트는 1을 반환합니다. 대체적으로, 언 바운드 변수로 행을 바인더 (예 : /bin/false
)를 반환하는 명령을 가진 명령이있는 경우, 그 종료 값이 내가 원하는대로 전파되면.
해결책 2
이 동작은 다른 bash 버전과 관련이 있습니다.원래 스크립트는 Bash 4.2에서 예상대로 작동하지만 3.2에는 작동하지 않습니다.별도의 스크립트 파일에 오류가 발생하기 쉬운 코드를 사용하고 서브 쉘에서 실행하는 데있어 이전 Bash 버전의 문제를 해결합니다.
#!/bin/bash
$BASH sub.sh
RETVAL=$?
if [[ "$RETVAL" != "0" ]]; then
echo "Dying!! Exit code: $RETVAL"
fi
.
sub.sh :
set -eu
echo yeah
echo $UNBOUND_VARIABLE
echo boo
. 다른 팁
쉘은 마지막 실행 된 명령의 결과로 종료됩니다.트랩 케이스에서 echo
가 일반적으로 성공으로 돌아옵니다.
가치를 전파하는 것, 단순히 exit
로
#!/bin/bash
set -eu
die() {
echo "Dying!!"
exit "$1"
}
trap 'die $?' EXIT
echo yeah
echo $unbound
echo boo
.
또한 set -e
가 해를 끼치는 것으로 간주됩니다 - 명령이 실패한 경우 스크립트가 종료 될 것이라고 생각합니다.
제휴하지 않습니다 StackOverflow