如何在 PROMPT_COMMAND 执行期间检查 PIPESTATUS 等效项?

如何在 PROMPT_COMMAND 执行期间检查 PIPESTATUS 等效项?

$PROMPT_COMMAND在 bash 中有一个自定义记录最后执行的命令及其返回代码。我$?很高兴地使用后者,直到我意识到对于管道命令来说这是不够的。我想我应该记录${PIPESTATUS[@]}一下。

不幸的是$PIPESTATUS似乎已经设置的调用$PROMPT_COMMAND。有没有诡计我可以使用它在执行期间访问此信息$PROMPT_COMMAND

答案1

提示命令中的命令功能 alter PIPESTATUS,在提示命令之后bash保存和恢复PIPESTATUS(和),请参阅$?此处对预期行为的描述

诀窍是将$PIPESTATUS[](和/或$?)保存在第一个声明函数的值,之后原始值将被覆盖。

function myprompt() {
   _pipestatus=( "${PIPESTATUS[@]}" )
   echo "current: ${PIPESTATUS[@]}"
   echo "cached : ${_pipestatus[@]}"
}

PROMPT_COMMAND=myprompt

然后:

$ true | false | true
current: 0
cached : 0 1 0

我做了与您所描述的类似的操作,但在陷阱处理程序函数中ERR而不是提示命令中。

答案2

嗯,也许这也取决于 bash 版本。

让我们在 bash 配置文件配置中尝试这个简单的分配:

导出 PROMPT_COMMAND="回显状态=$?"

bash 4.1.2 工作正常。在 bash 提示符下,我输入了一个不存在的命令:

状态=127

bash 3.2.25 总是打印

状态=0

在命令行中,我检查变量

回显$PROMPT_COMMAND

在工作主机上,它对应于我的任务。在另一台主机上,其值为

历史记录-a;历史记录-n;回显状态=$?

为什么会有这些命令?他们是问题的根源吗?

相关内容