我$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;回显状态=$?
为什么会有这些命令?他们是问题的根源吗?