BASH: 트랩의 종료 상태 변경

BASH: 트랩의 종료 상태 변경

트랩 핸들러의 쉘 스크립트에 다른 종료 상태를 지정할 수 있습니까?

시행착오를 거쳐 통화 exit종료 trap상태가 변경될 수 있다는 것을 발견했습니다. 일반 명령은 실패하든 성공하든 종료 상태를 변경하지 않습니다.

이제 이 동작을 신뢰할 수 있는지, 아니면 구현에 문제가 있는 것인지 궁금합니다.

이에 대한 문서를 찾으려고 노력했지만 아무 소용이 없었습니다.

테스트 스크립트:

#!/bin/bash
function handler {
    # a successful command won't change script exit status
    echo handler, status=$1
    # badcommand won't change script exit status
    #badcommand
    # exit will change script exit status
    #exit 23
}
trap 'handler $?' EXIT
#badcommand

용법:

./trap_test.sh; echo status_out=$?

답변1

트랩을 호출하여 종료 상태를 변경할 수 있음을 발견했습니다 exit. 일반 명령은 실패하든 성공하든 종료 상태를 변경하지 않습니다. 이제 이 동작을 신뢰할 수 있는지, 아니면 구현에 문제가 있는 것인지 궁금합니다.

예, 신뢰할 수 있으며 셸에 문서화되어 있습니다.기준:

name
exit- 쉘을 종료시킵니다
...
설명
...
트랩은 EXIT쉘이 종료되기 전에 실행되어야 합니다.exit유틸리티가 트랩 자체 내에서 호출 되지 않는 한 , 이 경우 쉘은 즉시 종료되어야 합니다.
...
종료 상태 지정된 경우
종료 상태는 다음과 같아야 하지만 부호 없는 십진 정수 이상이 아니면 동작 n이 지정되지 않습니다. 그렇지 않은 경우 값은 실행된 마지막 명령의 종료 값이어야 하며, 명령이 실행되지 않은 경우 0이어야 합니다.n255트랩 작업 내에서 실행되는 경우 exit마지막 명령은 트랩 작업 직전에 실행된 명령으로 간주됩니다.

(똑같은 것 return)

exit명령 은 없지만 exit트랩이 설정된 경우 다음을 적용해야 합니다.

달리 명시하지 않는 한, 명령의 종료 상태는 해당 명령에 의해 실행된 마지막 단순 명령의 종료 상태입니다.

복합 명령, 순차 목록 등에 관한 모든 규칙과 마찬가지로 이러한 규칙에는 EXIT트랩 존재에 대한 특별한 예외가 없습니다.

답변2

매뉴얼 페이지에는 이에 대한 언급이 없으므로 코드를 보는 것 외에 실험을 해보는 것이 무슨 일이 일어나는지 알아내는 가장 좋은 방법인 것 같습니다.

종료 트랩이 항상 종료 상태를 변경하지는 않는다는 것이 이해가 됩니다. 스크립트는 트랩을 통해 종료 시 일부 정리를 수행하려고 할 수 있지만 기본 스크립트에서 설정한 종료 상태로 정리가 엉망이 되지는 않을 수 있습니다. 그리고 말씀하신 대로 트랩을 exit다시 실행하여 원하는 값을 설정할 수 있습니다.

예를 들어 다음과 같은 경우가 있습니다.

tmpfile=$(mktemp)
trap 'rm -f "$tmpfile"' EXIT
# something
exit 1

종료 상태를 0으로 재설정 할 수도 있는데 rm이는 별로 좋은 일이 아닌 것 같습니다.

관련 정보