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

Ton*_*ony 3 prompt zsh quoting command

我在尝试PS1使用Ubuntu 17.10上的zsh在我的提示中获得动态评估的命令输出时遇到了最困难的时刻。以下是我所做的一些尝试(我从 directory 开始,/abc提示为粗体):

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

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

Kus*_*nda 5

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

set -o PROMPT_SUBST
PS1='$(pwd) > '
Run Code Online (Sandbox Code Playgroud)

请注意,有没有必要exportPS1变量。

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

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

PS1='%/ > '
Run Code Online (Sandbox Code Playgroud)

有关这方面的更多信息,请参阅zshmisc系统手册中的“扩展提示序列”部分。


当你使用

PS1="$(pwd) > "
Run Code Online (Sandbox Code Playgroud)

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