從一個bash腳本,我試圖處理來自C++程序的分段錯誤。我讀過SIGCHLD
上的trap
可用於此目的。在陷阱內部,我應該可以測試$?
以從程序中獲取返回代碼。例如,請參見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
程序正義事業段錯誤:
#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基準值+ SIGSEGV的11)。
萬一它很重要,RHEL 6.2,bash 4.1.2(1) - 發佈。
似乎是絕對正確的。我用自己的方式測試了它,用一個值得信賴的C++程序給出了一個可選的退出代碼,而不是你神祕的bash命令。在陷阱裏面,$?有上一個命令的退出碼,而不是觸發陷阱的那個。傷心,沒用。對於我特別的問題,我用$ PIPESTATUS解決了這個問題,這要歸功於這個答案:http://unix.stackexchange.com/questions/14270/get-exit-status-of-process-thats-piped-to-another/73180# 73180 – RaveTheTadpole