Unbuffer 会吞掉被终止进程的退出状态

Unbuffer 会吞掉被终止进程的退出状态

如果进程被终止,expect“unbuffer”命令似乎会吞掉其子进程的退出状态。有什么办法可以阻止这种行为吗?通常,如果子进程以非零退出状态退出,它不会吞掉退出状态。

为了见证这种行为,请考虑两个 bash 脚本:

a.sh:

    exit 1

对比

b.sh:
    kill -11 $$

然后对每个执行 unbuffer 并打印 $?。在第一种情况下,我看到的是 1,但在第二种情况下,我看到的是 0,而我期望的是 139

答案1

是的,你必须修改“unbuffer”脚本来改变“unbuffer”等待子进程终止的方式。

来自期望文档:

wait 返回值的末尾可能会出现其他元素。可选的第五个元素标识一类信息。目前,此元素的唯一可能值是 CHILDKILLED,在这种情况下,接下来的两个值是 C 样式信号名称和简短的文本描述。

在“unbuffer”脚本中,查找exit [lindex [wait] 3]并替换以下代码:

set result [wait]
send_user "wait returned: $result\n"
if { [llength $result] == 4 } {
    exit [lindex $result 3]
} else {
    exit 1
}

经过修改后,您将清楚地看到差异。例如,运行b.sh脚本,您将得到如下结果:

wait returned: 8606 exp6 0 0 CHILDKILLED SIGSEGV {segmentation violation}

当然,您可以随意更改 的值exit 1。如果愿意,您可以以 139 退出,但除非您在“取消缓冲”脚本中添加更多代码,否则该值不会更改以匹配信号。

相关内容