单引号和双引号中的PS1变量 - bashrc

3

我已按照以下方式设置了我的bashrc文件(适用于Git Bash

source ~/git-prompt.sh
source ~/git-completion.bash
export GIT_PS1_SHOWDIRTYSTATE=true
PS1='\[\e[0;37m\]\342\224\214\342\224\200[\[\e[0m\]\[\e[1;32m\]\u\[\e[0;37m\]:\[\e[1;34m\]\h\[\e[0;37m\]]\342\224\200[\[\e[33m\]\W\[\e[0;37m\]]\342\224\200[\[\e[1;33m\]\@\[\e[0m\]]$(__git_ps1)\n\[\e[0;37m\]\342\224\224\342\224\200\342\224\200\[\e[1;36m\]\$\[\e[0m\] '

忽略八进制字符,它可以简化为:
PS1='\[\e[0;37m\]-[\[\e[0m\]\[\e[1;32m\]\u\[\e[0;37m\]:\[\e[1;34m\]\h\[\e[0;37m\]]-[\[\e[33m\]\W\[\e[0;37m\]]-[\[\e[1;33m\]\@\[\e[0m\]]$(__git_ps1)\n\[\e[0;37m\]-\[\e[1;36m\]\$\[\e[0m\] '

这个方法很好,但是当我尝试使用以下段落获取命令状态符号时(从ArchWiki看到的),它就不起作用了:

\$([[ \$? != 0 ]] && echo \"[\[\e[1;31m\]X\[\e[0;37m\]]-\") # again, shortened the octal codes for readability

我注意到唯一的不同是ArchWiki中使用双引号,而在我的情况下使用单引号。因此,我也在我的文件中使用双引号:

PS1="\[\e[0;37m\]\$([[ \$? != 0 ]] && echo \"[\[\e[1;31m\]X\[\e[0;37m\]]-\")-[\[\e[0m\]\[\e[1;32m\]\u\[\e[0;37m\]:\[\e[1;34m\]\h\[\e[0;37m\]]-[\[\e[33m\]\W\[\e[0;37m\]]-[\[\e[1;33m\]\@\[\e[0m\]]$(__git_ps1)\n\[\e[0;37m\]-\[\e[1;36m\]\$\[\e[0m\] "

然后包含上述代码段:

PS1="\[\e[0;37m\]-[\[\e[0m\]\[\e[1;32m\]\u\[\e[0;37m\]:\[\e[1;34m\]\h\[\e[0;37m\]]-[\[\e[33m\]\W\[\e[0;37m\]]-[\[\e[1;33m\]\@\[\e[0m\]]$(__git_ps1)\n\[\e[0;37m\]-\[\e[1;36m\]\$\[\e[0m\] "

这很好用,但是我的git自动补全不再起作用了。如果我进入一个git存储库,$(__git_ps1) 没有返回值。如果我从git存储库内部重新启动bash,它会显示当前分支,但是当我离开目录或切换分支时又无法执行。
以下陈述是否有差异?
x="yzx"
x='yzx'

PS

这是关于在Windows 7环境下的内容,如果有人想知道。

1个回答

2
在您的情况下,您使用了多个转义字符,使用\。双引号"..."和单引号'...'之间的区别是,在双引号中,shell会查看内部以解释转义序列,而在单引号中,它会将反斜杠视为字面值。请尝试以下内容:
echo '\$foo'
echo "\$foo"

并且你会看到差异。


5
具体来说,在PS1被定义时,$(__git_ps1)会被替换掉,这是由于双引号的原因。相反,您希望推迟评估,直到显示提示符,因此单引号更加合适。 - glenn jackman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接