zsh 中的 PS1 变量未发生命令替换

zsh 中的 PS1 变量未发生命令替换

我在尝试在PS1提示符中获取动态评估的命令输出时遇到了最困难的时间桀骜在 Ubuntu 17.10 上。以下是我所做的一些尝试(我从目录开始/abc,提示以粗体显示):

$导出 PS1="$(pwd) > "
/abc >cd /定义
/abc >密码
/def
/abc >导出 PS1="\$(pwd) > "
$(密码) >导出 PS1='$(pwd) > '
$(密码) >导出 PS1='\$(pwd) > '
\$(密码) > [愤怒退出]

第一个结果是最接近的,但看起来pwd当我定义变量时该命令仅被评估一次PS1。显然有一些我不明白的事情。$(<cmd>)每次显示命令提示符时我该怎么做才能重新评估?

答案1

要让zshshell 对 的值执行命令替换PS1,请设置PROMPT_SUBSTshell 选项:

set -o PROMPT_SUBST
PS1='$(pwd) > '

请注意,不需要exportPS1变量。

PROMPT_SUBST默认情况下未设置 shell 选项的原因很可能是zshshell 已经具有丰富的提示扩展语法。

例如,您的示例可以替换为

PS1='%/ > '

有关详细信息,请参阅zshmisc系统手册中的“提示序列的扩展”部分。


当你使用

PS1="$(pwd) > "

PS1在赋值之前,赋予变量的值会被扩展。这就是为什么当您更改目录时它不会更改的原因。

相关内容