일부 프로그램을 테스트하는 bash 스크립트가 있고 프로그램 중 하나가 반환 Segmentation fault
되므로 스크립트 헤드에 트랩을 추가하려고했습니다.
trap "echo 'segfault occured!'" SIGSEGV
그러나 그것은 아무것도하지 않았습니다. 나는 사용했다
echo $?
segfault를 생성하는 프로그램 직후에 출력으로 139 를 얻습니다 . 특정 오류 코드에 대한 트랩을 어떻게 추가합니까?
답변
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
.