$? 内击陷阱 从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设置陷阱

  • 对于每个命令:

    a。运行命令

    b。对接收到的信号执行陷阱

    c。设置
    $?

  • 执行
    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 $?"