我是 Linux 和 Bash 新手,想请教一下在分配 PS1 环境变量时单引号和双引号的作用。我想将终端设置为始终显示当前目录。起初我尝试这样做:
export PS1="\[\e[38;5;46m\]>\[\e[38;5;255m\]\[\e]0;$(pwd)\007\]"
这导致终端标题更新以显示当前目录当我按下 Enter 键时但如果我随后将 CD 复制到其他地方则不会。
通过漫无目的的反复试验,我最终尝试了:
export PS1='\[\e[38;5;46m\]>\[\e[38;5;255m\]\[\e]0;$(pwd)\007\]'
第二个版本使用单引号,达到了我想要的效果:每次我 cd 到新目录时终端标题都会更新。
有人能解释一下为什么单引号和双引号的用法有如此不同吗?谢谢。
我发现了这样的讨论:如何更改 mintty 窗口的标题?但 OP 似乎没有标记答案,并且我从该链接尝试的那些答案似乎对我的 shell 没有效果。
答案1
单引号和双引号的区别在于插值。
在第一个示例中,shell 在将表达式赋值给 PS1 变量之前,先在双引号之间插入表达式,因此,插入后变量的值将是
> /home/user
在第二个示例中,由于单引号的存在,shell 会直接将表达式赋值给变量,从而导致预期的行为(每次打印提示时,bash 都会根据当前目录插入表达式)。PS1 的值将是:
\[\e[38;5;46m\]>\[\e[38;5;255m\]\[\e]0;$(pwd)\007\]
您可以使用以下几个命令轻松地检查这一点:
$ a='hello'
$ b="${a} world"
$ c='${a} world'
$ echo $b
hello world
$ echo $c
${a} world
在 中$b
,变量a
被插入到字符串中,但在$c
中则没有,因此字符串被逐字打印。