Как я могу захватить программу, которая возвращает 139 (ошибка сегментации) в bash?

У меня есть скрипт bash, который проверяет некоторые программы, и одна из программ возвращает Segmentation fault поэтому я попытался добавить ловушку в голову моего скрипта:

 trap "echo 'segfault occured!'" SIGSEGV 

Это, однако, ничего не делало. я использовал

 echo $? 

сразу после программы, которая производит segfault, и я получаю 139 в качестве вывода. Как добавить ловушку для этого конкретного кода ошибки?

2 Solutions collect form web for “Как я могу захватить программу, которая возвращает 139 (ошибка сегментации) в bash?”

От man bash :

  trap [-lp] [[arg] sigspec ...] The command arg is to be read and executed when the shell receives signal(s) sigspec. 

Когда ваша программа segfaults, ваш bash просто получает SIGCHLD потому что какой-то ребенок вышел (каким бы то ни было способом).

Однако вы можете использовать код выхода, хранящийся в $? , в некоторых условных и ловушках SIGCHLD :

 trap 'if [[ $? -eq 139 ]]; then echo "segfault !"; fi' CHLD 

Обратите внимание, что set -bm может понадобиться, если это (что он, вероятно, делает) используется в неинтерактивном bash (например, в скрипте).

Изменить: см. Также этот ответ (Gilles) по аналогичной проблеме с использованием bash и trap .

trap "$instructions" SIGSEGV прерывает сегментирование ошибок в самой оболочке.

Если вы запустите свой скрипт под set -e , вы можете поместить ловушку в EXIT (или 0 ). Он будет выполнен, когда ваш скрипт завершится (из-за команды, возвращающей ненулевой статус, или путем явного вызова exit или отпадения конца скрипта). Чтобы проверить ошибку сегментации, проверьте $? при входе в ловушку. (Обратите внимание, что $? Может быть 139, потому что программа нормально возвращалась со статусом 139, это можно избежать, если вы выполняете свою обработку в оболочке).

 set -e trap 'case $? in 139) echo "segfault occurred";; esac' EXIT 

В bash или ksh или zsh вам не нужно использовать set -e для запуска ловушки после каждой команды, которая возвращает ненулевой статус, вместо этого вы можете поставить ловушку на ERR . Как и раньше, вам нужно проверить $? при входе в ловушку, и 139 может (но редко) означает, что программа вернула этот статус.

Linux и Unix - лучшая ОС в мире.