$? 内击陷阱 从BASH脚本中,我试图处理C++程序中的分割错误。我已经读到,在SIGCHLD上使用trap可以用于此目的。在陷阱中,我应该能够测试$?以从程序中获取返回代码。例如,见
这对我不起作用,我也不知道为什么 以下是脚本:$? 内击陷阱 从BASH脚本中,我试图处理C++程序中的分割错误。我已经读到,在SIGCHLD上使用trap可以用于此目的。在陷阱中,我应该能够测试$?以从程序中获取返回代码。例如,见,bash,signals,return-value,bash-trap,Bash,Signals,Return Value,Bash Trap,这对我不起作用,我也不知道为什么 以下是脚本: #! /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 <iostr
#! /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;
}
关键部分是陷阱结果代码0
。这就是我希望它说139来表示SIGSEGV的地方(对于SIGSEGV是128个基值+11)
如果有关系,RHEL 6.2,bash 4.1.2(1)-发布。我不确定,但我认为shell在调用
CHLD
的处理程序时还没有更新$?
的值。考虑这个脚本:
set -bm
trap 'echo "Trap result code $?"' CHLD
echo "Script: starting program"
(exit 9)
(exit 11)
echo "Script: result code from program was $?"
我用一个模拟SEG故障的简单子shell来替换C++程序。当我运行它时,CHLD
trap打印“trap result code 9”,表明trap在触发trap之前看到了命令的退出状态。将第一个子shell调用的值更改为退出将更改陷阱打印的值
您链接到的问题将捕获
退出
伪信号。如果不深入了解bash
源代码,我怀疑会发生以下情况:
CHLD设置陷阱
$?
EXIT
trap,如果有在步骤2b中,与2a中的命令相对应的
$?
值尚不可用。在步骤3中,与脚本关联的$?
值可用,因为它与脚本中执行的最后一个命令的2c值相同。似乎是绝对正确的。我用自己的方式测试了它,它提供了一个可信的C++程序,它提供了一个可选择的退出代码,而不是神秘的BASH命令。在陷阱里,$?具有上一个命令的退出代码,而不是触发陷阱的命令的退出代码。悲伤而无用。对于我的特殊问题,我使用$PIPESTATUS解决了它,这要感谢以下答案:
set -bm
trap 'echo "Trap result code $?"' CHLD
echo "Script: starting program"
(exit 9)
(exit 11)
echo "Script: result code from program was $?"