ZSH setopt PROMPT_SUBST 不起作用

Geo*_*rge 5 zsh

我正在尝试自定义我的 zsh 提示符,并希望在每次生成提示符时使用 git 命令评估函数。我正在使用setopt PROMPT_SUBST,但它似乎不起作用。这是我的 zshrc:

setopt PROMPT_SUBST
autoload -U colors && colors # Enable colors

# Show Git branch/tag, or name-rev if on detached head
parse_git_branch() {
  echo "PARSING GIT BRANCH"
  (git symbolic-ref -q HEAD || git name-rev --name-only --no-undefined --always HEAD) 2> /dev/null
}

prompt() {
    echo -n "%/"
    echo "$(git status)"
}

PS1="$(prompt)"
Run Code Online (Sandbox Code Playgroud)

这是我的输出setopt

interactive
login
monitor
nonomatch
promptsubst
shinstdin
zle
Run Code Online (Sandbox Code Playgroud)

che*_*ner 10

您需要延迟调用prompt,直到显示提示;通过使用单引号来做到这一点:

PS1='$(prompt)'
Run Code Online (Sandbox Code Playgroud)

不过,更好的想法是定义一个设置 的函数PS1,然后将该函数添加到precmd_functions数组中,以便在显示每个提示之前执行它。

prompt () {
    PS1="%/$(git status)"
}

precmd_functions+=(prompt)
Run Code Online (Sandbox Code Playgroud)

  • @George,单引号抑制 shell 扩展,因此 `$()` 成为存储在 PS1 中的值的一部分。相比之下,在双引号内,PS1 中实际存储的是立即运行该命令一次的输出。 (5认同)
  • 使用单引号时,`PS1` 设置为文字字符串`$(prompt)`,而不是调用`prompt` 的结果。不过,提示变量很特殊;当它们显示时,它们会进行另一轮评估,因此每次显示提示时`$(prompt)`都会展开。 (3认同)