在 Fedora/Red Hat 的 /etc/bashrc 文件中,我看到以下行:
[ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\u@\h \W]\\$ "
正在进行什么检查[ "$PS1" = "\\s-\\v\\\$ " ]
?为什么仅当测试成功时才设置 PS1?
答案1
\s-\v\$␣
是默认的提示字符串,Bash 在PS1
未设置的情况下交互启动时设置的值。它显示 shell 进程的基本名称(通常bash
为 或sh
)、版本和美元符号,例如bash-4.4$
。 (或者用 a#
代替$
if 以 root 身份运行。)
的想法似乎是设置一个更有用的提示,但如果其他启动文件已经设置了它,则不会。
反斜杠加倍,"\\s-\\v\\\$ "
因为双引号字符串内的\x
某些值具有特殊含义x
。\\
明确地代表字面上的反斜杠。 (尽管由于某种原因他们没有在作业方面这样做)。
使用单引号字符串将使反斜杠更容易阅读:
[ "$PS1" = '\s-\v\$ ' ] && PS1='[\u@\h \W]\$ '
答案2
正在进行的检查是字符串比较=
。它将 $PS1 的值与 string 进行比较\s-\v\$
,其中需要在字符串中转义反斜杠,以便将它们与实际反斜杠进行比较,而不是尝试转义后面的字符。
该&&
语法是仅当前面的测试成功时才设置 PS1 的部分。
这里的整体逻辑显然是仅当 PS1 先前设置为特定值时才更新 PS1。
答案3
(我争论过是否要将此作为答案,因为这真是一个赃物,但你走吧......)
只是一个理论,但第一种形式(例如bash-3.2.1$
)看起来像我以 root 或其他“非用户”帐户登录时经常看到的提示。第二种最重要的形式(例如[joeblow@myhost /tmp]$
)更加以用户为中心。所以也许这是为了检测何时从系统帐户转到用户帐户......然后,只有到那时,才更改为更合适的提示。否则假设有人想要保留当前提示。
答案4
我相信比较是检查 shell 是否是交互式会话。\s-\v$
作为 $PS1 varbash-5.0$
在我的机器上的计算结果。请参阅此处的差异:
Jonathans-Air:~ lirum$ bash
bash-5.0$ echo "$PS1"
\s-\v\$
bash-5.0$ exit
exit
Jonathans-Air:~ lirum$ echo "$PS1"
\h:\W \u\$