从默认值来看.bashrc
是这样的:
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt
# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
;;
*)
;;
esac
通过发出 echo 命令来检查结果:
$ echo $PS1
\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$
似乎${debian_chroot:+($debian_chroot)}
将对命令行提示符执行条件插入,但不会对终端标题执行条件插入。似乎作者.bashrc
打算将其显示在左侧的两个地方user@host
,但实际上它并没有出现在两个地方。的评估debian_chroot
发生在定义 PS1 时,但当时并不打算进行评估,而是打算在提示时进行评估。问题的根源在于,在构建字符串时,""
引用会进行评估,而''
引用不会。评估很早,因为括在中的整个内容\[
\]
都是针对标题的。解释正确吗?
答案1
我想说整件事都不重要。debian_chroot
安顿好了/etc/bash.bashrc
。可以肯定的是,在正常情况下,如果设置了变量,则启动了新的 shell -/etc/bash.bashrc
否则为什么要获取源代码?在这种情况下,~/.bashrc
也会获取源代码。因此,要么在您显示的行中设置和修改变量时设置变量PS1
,要么不设置,并且不会设置。效果是一样的。
我只能猜测为什么最初的开发人员在设置时使用单引号PS1
。 大概开发人员已经学会了谨慎,""
只在必要时使用,也就是在修改时PS1
。
请注意,:+
如果变量未设置,则意味着不执行任何操作。
答案2
${debian_chroot:+($debian_chroot)}
插入取决于$debian_chroot
变量或/etc/debian_chroot
文件的存在。
这是一个简单的例子。在下面的屏幕截图中,我通过 ssh 连接到装有 Ubuntu Snappy 的 Raspberry Pi,它设置了$debian_chroot
变量(默认情况下),而我的笔记本电脑的 Ubuntu 没有。您可以在选项卡中看到生成的提示,在这两种情况下,变量$TERM
都是xterm
现在,如果变量$TERM
是其他东西,它不会改变 GUI 终端标题。screen
例如,这可能是连接到一个会话,其中变量$TERM
是screen
。