bashrc PS1 检查 [ “$PS1” = “\\s-\\v\\\$ ” ] 是什么意思?

bashrc PS1 检查 [ “$PS1” = “\\s-\\v\\\$ ” ] 是什么意思?

在 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\$

相关内容