답변:
trap "$instructions" SIGSEGV
쉘 자체에서 분할 결함을 트랩합니다.
에서 스크립트를 실행 set -e
하면 EXIT
(또는 0
) 에 트랩을 넣을 수 있습니다 . 스크립트가 종료되면 (0이 아닌 상태를 리턴하는 명령으로 인해 또는 명시 적으로 호출 exit
하거나 스크립트의 끝에서 떨어짐으로 인해) 실행됩니다. 세그먼테이션 결함을 테스트하려면 $?
트랩 진입을 점검하십시오 . ( $?
프로그램이 139 상태로 정상적으로 리턴되었으므로 139 일 수 있습니다. 쉘에서 처리를 수행하는 경우 피할 수 없습니다.)
set -e
trap 'case $? in
139) echo "segfault occurred";;
esac' EXIT
bash 또는 ksh 또는 zsh에서는 set -e
0이 아닌 상태를 반환하는 각 명령 후에 트랩을 실행하는 데 사용할 필요가 없으며 ERR
대신 트랩을 설정할 수 있습니다 . 이전과 마찬가지로 $?
트랩 진입 을 확인해야 하며 139는 프로그램이이 상태를 반환했음을 의미 할 수 있습니다.
보낸 사람 man bash
:
trap [-lp] [[arg] sigspec ...]
The command arg is to be read and executed when the shell
receives signal(s) sigspec.
프로그램이 segfaults 할 때, SIGCHLD
어떤 아이가 (어쨌든) 빠져 나갔기 때문에 bash는 단지 얻을 수 있습니다.
그러나, $?
일부 조건부 및 트랩에 저장된 종료 코드를 사용할 수 있습니다 SIGCHLD
.
trap 'if [[ $? -eq 139 ]]; then echo "segfault !"; fi' CHLD
참고 set -bm
이 (아마 무엇을) (예 : 스크립트로) 대화 형이 아닌 떠들썩한 파티에서 사용하는 경우 필요할 수 있습니다.
편집 : 참고 이 (질 ') 답변을 사용하여 유사한 문제에 bash
와 trap
.
trap "echo 'something happened'" {1..31}
나를 위해 일합니다 ( !
및로 연결되는 신호 사양은 bash: trap: XX: invalid signal specification
제외).
trap "echo 'something happened!'" {1..64}
하지만 여전히 아무것도 얻지 못한다. 난과 tryiedset -bm
하고set -o monitor
있지만, 나다.