$? внутри ловушки Баш
Из скрипта bash я пытаюсь обработать ошибки сегментации из программы на C++. Я прочитал это, используя trap
на SIGCHLD
может быть использован для этой цели. Внутри ловушки я должен быть в состоянии проверить $?
получить код возврата из программы. См. https://unix.stackexchange.com/questions/24307 например.
Это не работает для меня, и я не могу понять, почему.
Вот сценарий:
#! /bin/bash
set -bm
trap 'echo "Trap result code $?"' CHLD
echo "Script: starting program"
./sigsegv
echo "Script: result code from program was $?"
Как вы можете догадаться, sigsegv
программа просто вызывает segfault:
#include <csignal>
#include <iostream>
using namespace std;
int main(int argc, char** argv)
{
cout << "C++ will now cause a SIGSEGV" << endl;
raise(SIGSEGV);
cout << "After signal -- shouldn't get here" << endl;
return 0;
}
Когда я запускаю скрипт оболочки, я получаю это:
$./wrappersimple.sh
Script: starting program
C++ will now cause a SIGSEGV
Trap result code 0
./wrapper.sh: line 8: 26368 Segmentation fault (core dumped) ./sigsegv
Script: result code from program was 139
Ключевая часть была Trap result code 0
, Вот где я ожидал, что он скажет 139, чтобы указать SIGSEGV (что составляет 128 базовых значений + 11 для SIGSEGV).
В случае, если это имеет значение, RHEL 6.2, bash 4.1.2(1)-релиз.
1 ответ
Я не уверен, но я думаю, что оболочка еще не обновила значение $?
в то время обработчик для CHLD
называется. Рассмотрим этот скрипт:
set -bm
trap 'echo "Trap result code $?"' CHLD
echo "Script: starting program"
(exit 9)
(exit 11)
echo "Script: result code from program was $?"
Я заменяю вашу программу на C++ простой подоболочкой, которая имитирует ошибку сегмента. Когда я запускаю его, CHLD
trap печатает "Код результата ловушки 9", указывая, что ловушка видит состояние выхода команды до той, которая запускает ловушку. Изменение значения первого вызова subshell на exit
изменяет значение, напечатанное ловушкой.
Вопрос, который вы связываете с ловушками EXIT
псевдо-сигнал. Без погружения в bash
Исходный код, я подозреваю, что происходит так:
Установить ловушку для
CHLD
Для каждой команды:
а. Команда запуска
б. Выполнить ловушку для полученного сигнала
с. Задавать
$?
казнить
EXIT
ловушка, если естьВыход
На шаге 2b значение $?
соответствующая команда в 2а пока недоступна. На шаге 3 значение $?
Связанный со сценарием доступен, потому что он совпадает со значением из 2c, из последней команды, выполненной в сценарии.