我使用的是 zsh 5.8 (arm-apple-darwin20.2.0)。与 bash 中的方式不同, zsh 中的管道PIPESTATUS
在下一个 shell 提示符下可以读取,而pipestatus
zsh 中的管道似乎在接下来的提示符下消失了。
❯ true | false | true ; echo $pipestatus
0 1 0
❯ true | false | true
❯ echo $pipestatus
0
这种行为与答案中建议的行为不同这里,并且 zsh 文档没有提及任何与此相关的内容。
答案1
作为穆鲁在评论中写道,某些东西正在使用管道pipestatus
,因此可能会在与提示相关的自动化中覆盖。最有可能的罪魁祸首是钩子函数例如precmd
和preexec
1。
Bash 保存$?
,PIPESTATUS
以及一堆围绕陷阱的其他东西和PROMPT_COMMAND
(save_parser_state
)。 Zsh$?
在许多情况下(在来源,寻找保存的地方lastval
),包括扩展提示(promptexpand
) 和运行钩子,例如precmd
和preexec
(callhookfunc
来电doshfunc
与noreturnval=1
),但它永远不会保存pipestatus
.
¹提示中的代码还可以设置变量,如果prompt_subst
已设置,但子 shell 中会有一个管道,并且不会覆盖原始 shell 的pipestatus
.