Bash PS1 以及单引号与双引号

Bash PS1 以及单引号与双引号

我是 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中则没有,因此字符串被逐字打印。

相关内容