Bash 提示符技巧

这里有一些你可以用来定制你的 Bash 提示符的隐藏技巧。
456 位读者喜欢这篇文章。
System statistics with sar and the /proc filesystem

ajmexico,由 Jason Baker 修改。CC BY-SA 2.0。

任何在 Linux 中启动终端的人都熟悉默认的 Bash 提示符。

[user@$host ~]$

但是你知道它是完全可定制的,并且可以包含一些非常有用的信息吗? 这里有一些你可以用来定制你的 Bash 提示符的隐藏技巧。

Bash 提示符是如何设置的?

Bash 提示符由环境变量 PS1 (提示字符串 1) 设置,用于交互式 shell 提示符。 还有一个 PS2 变量,当需要更多输入来完成 Bash 命令时使用。

[dneary@dhcp-41-137 ~]$ export PS1="[Linux Rulez]$ "
[Linux Rulez] export PS2="... "
[Linux Rulez] if true; then
... echo "Success!"
... fi
Success!

PS1 的值在哪里设置?

PS1 是一个常规的环境变量。

系统默认值在 /etc/bashrc 中设置。 在我的系统中,默认提示符是用这一行设置的

[ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\u@\h \W]\\$ "

这测试了 PS1 的值是否为 \s-\v$ (系统默认值),如果是,则将 PS1 设置为值 [\u@\h \W]\\$

但是,如果你想看到自定义的提示符,你不应该编辑 /etc/bashrc。 你应该将它添加到你的 Home 目录中的 .bashrc 中。

\u, \h, \W, \s 和 \v 是什么意思?

man bashPROMPTING 部分,你可以找到 PS1PS2 中所有特殊字符的描述。 以下是默认选项

  • \u: 用户名
  • \h: 简短主机名
  • \W: 当前工作目录的基本名称(家目录为 ~ ,其他地方为当前目录的结尾)
  • \s: Shell 名称(bashsh,取决于 shell 的调用方式)
  • \v: Shell 的版本

我可以在提示符中使用哪些其他的特殊字符串?

有许多有用的特殊字符串。

  • \d: 展开为 "Tue Jun 27" 格式的日期
  • \D{fmt}: 允许自定义日期格式 - 有关可用选项,请参阅 man strftime
  • \D{%c}: 以当前语言环境提供日期和时间
  • \n: 包含一个新行(请参阅下面的多行提示)
  • \w: 当前工作目录的完整路径
  • \H: 当前机器的完整主机名
  • \!: 历史记录编号 - 你可以使用 shell 历史记录事件指示符 ! 后跟你要查找的特定命令的编号来运行任何以前的命令。(使用 Linux 历史记录是另一个教程...)

还有许多其他的特殊字符 - 你可以在 Bash man pagePROMPTING 部分中看到完整列表。

多行提示

如果使用较长的提示符(例如,如果包含 \H\w 或完整的 date-time),你可能希望将内容分成两行。 这是一个多行提示的示例,其中日期、时间和当前工作目录在一行,username @hostname 在第二行

PS1="\D{%c} \w\n[\u@\H]$ "

还有其他有趣的事情可以做吗?

人们偶尔做的一件事是创建彩色提示符。 虽然我发现它们很烦人并且分散注意力,但你可能会喜欢它们。 例如,要将上面的日期时间更改为以红色文本显示,将目录以青色显示,并将用户名以黄色背景显示,你可以尝试这样做

PS1="\[\e[31m\]\D{%c}\[\e[0m\]
    \[\e[36m\]\w\[\e[0m\]\n[\[\e[1;43m\]\u\[\e[0m\]@\H]$ "

为了分析这一点

  • \[..\] 声明一些非打印字符
  • \e[.. 是一个转义字符。 接下来是一个特殊的转义序列,用于更改终端中的颜色(或其他特征)
  • 31m 是红色文本(41m 将是红色背景)
  • 36m 是青色文本
  • 1;43m 声明黄色背景(1;33m 将是黄色文本)
  • 末尾的 \[\e[0m\] 将颜色重置为终端默认值

你可以在 Bash prompt HOWTO 中找到更多颜色和提示。 你甚至可以使文本反转或闪烁! 我不知道为什么会有人想这样做。 但是你可以!

你最喜欢的 Bash 提示符自定义设置是什么? 你见过哪些让你抓狂的设置? 请在评论中告诉我。

标签
User profile image.
Dave Neary 是 Red Hat 的开源和标准团队的成员,帮助使对 Red Hat 重要的开源项目取得成功。 自 1999 年向 GIMP 发送他的第一个补丁以来,Dave 一直活跃在自由和开源软件领域,扮演着许多不同的角色。

8 条评论

这里有一些好的、有用的技巧。 特别是关于特殊字符串和多行提示的那些 - 我总是忘记那些...

如果能看到这些更改的一些截图就好了。 还有,像这样的东西

"$PS1" = "\\s-\\v\\\$ " ] && PS1="[\u@\h \W]\\$ "

看起来绝对可怕。 我的天啊... 这是什么一堆乱七八糟的字符。 不得不处理一些 Linux 语法时,经常会想念 DOS/4DOS 提示符。 你可以用 4dos 做很多事情,而无需阅读 300 页的手册才能在 Linux 上做同样的事情。 这太疯狂了。 唉...

感谢你的反馈 John! 我同意,一些 shell 结构非常令人困惑,需要解释 - 尤其是这个,它的形式是
[ test ] && action

[ ... ] 测试一个动作是否返回 true 或 false。

a && b 执行 a,如果 a 为 true,则执行 b(并评估为 true 或 false,取决于两个命令是否都返回 true(或成功))。

因此 "[ test ] && action" 只有在测试返回 true 时才会执行该动作。 它等同于

if [ test ]; then
action;
fi

也许 shell 内置函数应该是我下一篇文章的主题?

再次感谢!
Dave.

回复 ,作者 john78 (未验证)

4DOS/4OS2/4CMD... 都用过! 它们确实远远领先于它们的时代。 顺便说一句,有一些很好的包装器可以从高级描述生成提示符...

回复 ,作者 john78 (未验证)

谢谢! 这太棒了!

我没有提到的一件事,这个脚本使用了它,是如何在 PS1 中执行外部命令。
PS1="$(cmd)"

谢谢,
Dave.

回复 ,作者 bcotton

Creative Commons License本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.