![zsh 中的 PS1 变量未发生命令替换](https://linux22.com/image/130644/zsh%20%E4%B8%AD%E7%9A%84%20PS1%20%E5%8F%98%E9%87%8F%E6%9C%AA%E5%8F%91%E7%94%9F%E5%91%BD%E4%BB%A4%E6%9B%BF%E6%8D%A2.png)
我在尝试在PS1
提示符中获取动态评估的命令输出时遇到了最困难的时间桀骜在 Ubuntu 17.10 上。以下是我所做的一些尝试(我从目录开始/abc
,提示以粗体显示):
$导出 PS1="$(pwd) > " /abc >cd /定义 /abc >密码 /def /abc >导出 PS1="\$(pwd) > " $(密码) >导出 PS1='$(pwd) > ' $(密码) >导出 PS1='\$(pwd) > ' \$(密码) > [愤怒退出]
第一个结果是最接近的,但看起来pwd
当我定义变量时该命令仅被评估一次PS1
。显然有一些我不明白的事情。$(<cmd>)
每次显示命令提示符时我该怎么做才能重新评估?
答案1
要让zsh
shell 对 的值执行命令替换PS1
,请设置PROMPT_SUBST
shell 选项:
set -o PROMPT_SUBST
PS1='$(pwd) > '
请注意,不需要export
该PS1
变量。
PROMPT_SUBST
默认情况下未设置 shell 选项的原因很可能是zsh
shell 已经具有丰富的提示扩展语法。
例如,您的示例可以替换为
PS1='%/ > '
有关详细信息,请参阅zshmisc
系统手册中的“提示序列的扩展”部分。
当你使用
PS1="$(pwd) > "
PS1
在赋值之前,赋予变量的值会被扩展。这就是为什么当您更改目录时它不会更改的原因。