Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ZSH setopt提示符_SUBST不工作_Zsh - Fatal编程技术网

ZSH setopt提示符_SUBST不工作

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

我正在尝试自定义我的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 "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开销。