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:当前工作目录的基本名称(home 目录为 ~,其他地方为当前目录的结尾)
  • \s:Shell 名称(bashsh,取决于 shell 的调用方式)
  • \v:shell 的版本

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

有许多特殊的字符串可能很有用。

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

还有许多其他特殊字符——你可以在 Bash 手册页PROMPTING 部分看到完整列表。

多行提示符

如果你使用较长的提示符(例如,如果你包含 \H\w 或完整的 date-time),你可能想要将内容分成两行。这是一个多行提示符的示例,日期、时间和当前工作目录在一行,用户名 @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 提示符 HOWTO 中找到更多颜色和技巧。你甚至可以使文本反转或闪烁!我不知道为什么有人会想这样做。但是你可以!

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

标签
User profile image.
Dave Neary 是红帽开源和标准团队的成员,帮助使对红帽重要的开源项目取得成功。自 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,如果为真,则执行 b(并根据两个命令是否都返回 true(或成功)来评估为 true 或 false)。

所以 "[ test ] && action" 将仅在测试返回 true 时执行操作。它等同于

if [ test ]; then
action;
fi

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

再次感谢!
Dave。

回复 作者 john78 (未验证)

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

回复 作者 john78 (未验证)

谢谢!太棒了!

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

谢谢,
Dave。

回复 作者 bcotton

一个简单的拖放界面,用于构建你自己的 .bashrc/PS1 配置

http://bashrcgenerator.com/

玩得开心!

© . All rights reserved.