![Unbuffer 会吞掉被终止进程的退出状态](https://linux22.com/image/1405262/Unbuffer%20%E4%BC%9A%E5%90%9E%E6%8E%89%E8%A2%AB%E7%BB%88%E6%AD%A2%E8%BF%9B%E7%A8%8B%E7%9A%84%E9%80%80%E5%87%BA%E7%8A%B6%E6%80%81.png)
如果进程被终止,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 退出,但除非您在“取消缓冲”脚本中添加更多代码,否则该值不会更改以匹配信号。