출구 트랩을 갖는 스크립트에서 쉘 오류가 발생할 경우 발신자에게 종료 코드 전파

StackOverflow https://stackoverflow.com//questions/25064292

  •  23-12-2019
  •  | 
  •  

문제

은 종료 트랩이있는 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가 해를 끼치는 것으로 간주됩니다 - 명령이 실패한 경우 스크립트가 종료 될 것이라고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top