为什么手动设置bash提示(PS1)会导致root使用$而不是#?


11

我使用的是CentOS 6.4。默认情况下,root用户的提示符带有#符号,即看起来像[root@myserver ~]# 

echo $PS1打印出来[\u@\h \W]\$; 但是,如果我这样做了PS1="[\u@\h \W]\$"(不应该改变任何东西,afaics),我最终会看到类似以下的提示:[root@myserver ~]$

为什么当我尝试自己进行设置(我最终希望将其更改为更有用的功能)时,它会按$字面意义进行解释吗?我几乎可以找到每个页面(例如,“ 如何:更改/设置bash自定义提示(PS1)”),该提示\$#为根用户使用。


PS1=[\u@\h \W]\$返回-bash: W]$: command not found
choroba 2013年

@choroba糟糕,抱歉,应该删除双引号了PS1="[\u@\h \W]\$"
stripybadger 2013年

Answers:


14

在您的问题中,您暗示您根本就没有引号。这显然是错误的,因为这样空格会将参数分配“ PS1 = [\ u @ \ h”与命令“ \ W] \ $”分开。请意识到每个角色都很重要。

无论如何,您可能正在做的是使用双引号(“)而不是单引号(')。在解释您输入内容的shell中,它们的行为非常不同。使用双引号,它将尝试使用对于此分配,由于\ u,\ h和\ W没有什么特别之处,因此它们保持不变;方括号在不同的地方可能有特殊的含义,但在这种情况下不是这样,因此它们也留在原处;但是由于a $的含义多种多样,所有含义都很特殊,因此该\$顺序被解释为“忽略美元符号的特殊性,只保留它”,然后将该顺序替换为没有进一步解析的单个美元符号,所有结果都分配给PS1,并且由于存在一个字面的美元符号,而不是\$shell构造实际提示时的魔术序列,因此您只会获得美元符号,而不是依赖于有效用户的字符。实际的解析要复杂一些,但这就是这个特定示例的要旨。

您输入的内容:PS1="[\u@\h \W]\$ "
外壳分配的内容:PS1 <- "[\u@\h \W]$ "
您想要的内容:PS1 <- "[\u@\h \W]\$ "
您应该输入的内容:PS1='[\u@\h \W]\$ '

下一步:阅读类似本教程的内容,以了解有关Shell引用的更多信息。


1
是的,您发现了,我使用了双引号(对不起,您原来的问题中没有使用双引号),感谢您指出我的错误。
stripybadger 2013年

如果出于某种原因确实需要使用双引号,请使用PS1="...\\\$"来确保\$存储字面值对,PS1以便以后解释。
chepner 2013年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.