我是linux和Bash新手,希望在分配PS1 env var时要求帮助了解单引号和双引号的作用。我想将终端设置为始终显示当前目录。一开始我尝试了这个:
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到新目录时,终端标题都会更新。
有人可以解释为什么单引号和双引号的用法会有所不同吗?谢谢你。
我发现了以下讨论:如何更改薄荷窗口的标题?但是OP似乎没有标记答案,而我从该链接尝试的那些答案似乎在我的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
不是在内,因此按字面意义打印字符串。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句