ZSH setopt提示符_SUBST不工作
我正在尝试自定义我的zsh提示符,并希望在每次生成提示符时使用git命令对函数求值。我正在使用ZSH setopt提示符_SUBST不工作,zsh,Zsh,我正在尝试自定义我的zsh提示符,并希望在每次生成提示符时使用git命令对函数求值。我正在使用setopt PROMPT\u 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 "PAR
setopt PROMPT\u 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)"
这是我的setopt
输出:
interactive
login
monitor
nonomatch
promptsubst
shinstdin
zle
您需要延迟调用
prompt
,直到显示提示;请使用单引号:
PS1='$(prompt)'
不过,更好的办法是定义一个设置PS1的函数,然后将该函数添加到precmd_functions
数组中,以便在显示每个提示之前执行该函数
prompt () {
PS1="%/$(git status)"
}
precmd_functions+=(prompt)
你能详细解释一下“和”之间的区别吗?延迟调用什么东西到底意味着什么?@George,单引号抑制shell扩展,所以
$()
成为存储在PS1中的值的一部分。相反,在双引号内,PS1中实际存储的是立即运行一次命令的输出。使用单引号,PS1
设置为文本字符串$(提示)
,而不是调用提示符的结果。不过,提示符变量是特殊的;当显示它们时,它们会经历另一轮评估,因此$(提示符)
在每次显示提示时都会展开。这纯粹是一个zsh问题。bash在标题或标记中都没有位置。除非您完全确定您的问题适用于这两个shell,否则请不要标记其他shell(针对这两个shell测试代码,得到相同的结果)--即时引用错误适用于bash,但由于其他原因,您的复制程序无法在那里工作。顺便说一句,使用paren进行分组效率很低。最好使用大括号:{git symbolic ref-q HEAD | | git name rev--name only--no undefined--always HEAD;}2>/dev/null
--这样您就不会产生子shell开销。