트랩 핸들러의 쉘 스크립트에 다른 종료 상태를 지정할 수 있습니까?
시행착오를 거쳐 통화 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이어야 합니다.n
255
트랩 작업 내에서 실행되는 경우exit
마지막 명령은 트랩 작업 직전에 실행된 명령으로 간주됩니다.
(똑같은 것 return
)
exit
명령 은 없지만 exit
트랩이 설정된 경우 다음을 적용해야 합니다.
달리 명시하지 않는 한, 명령의 종료 상태는 해당 명령에 의해 실행된 마지막 단순 명령의 종료 상태입니다.
복합 명령, 순차 목록 등에 관한 모든 규칙과 마찬가지로 이러한 규칙에는 EXIT
트랩 존재에 대한 특별한 예외가 없습니다.
답변2
매뉴얼 페이지에는 이에 대한 언급이 없으므로 코드를 보는 것 외에 실험을 해보는 것이 무슨 일이 일어나는지 알아내는 가장 좋은 방법인 것 같습니다.
종료 트랩이 항상 종료 상태를 변경하지는 않는다는 것이 이해가 됩니다. 스크립트는 트랩을 통해 종료 시 일부 정리를 수행하려고 할 수 있지만 기본 스크립트에서 설정한 종료 상태로 정리가 엉망이 되지는 않을 수 있습니다. 그리고 말씀하신 대로 트랩을 exit
다시 실행하여 원하는 값을 설정할 수 있습니다.
예를 들어 다음과 같은 경우가 있습니다.
tmpfile=$(mktemp)
trap 'rm -f "$tmpfile"' EXIT
# something
exit 1
종료 상태를 0으로 재설정 할 수도 있는데 rm
이는 별로 좋은 일이 아닌 것 같습니다.