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 man pagePROMPTING 部分中查看完整列表。

多行提示符

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

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,如果为 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

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

http://bashrcgenerator.com/

玩得开心!

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© . All rights reserved.