如何在 Linux VPS 上自定义 Bash 提示符
介绍
在管理 Linux 服务器时,您会花费大量时间使用命令行。对于大多数人来说,这意味着要花很多时间在 Bash shell 上。
虽然大多数发行版都为用户和 root 提示的样式提供了合理的默认值,但自定义提示以添加您自己的首选项可能会有所帮助。您可以包含许多有用的信息,这些信息可以帮助您保持方向并在您以提升的权限操作时提醒您。
我们将使用 Ubuntu 12.04 VPS 进行实验,但几乎所有现代 Linux 发行版都应该以类似的方式运行。
验证您的 Shell 是 Bash
在我们开始实际定制 shell 之前,您应该验证您当前的 shell 实际上是 Bash。
对于绝大多数系统来说,这应该是正确的,但有时发行版维护者会选择不同的 shell,或者用户会测试新的 shell。
通过检查/etc/passwd
文件很容易验证。在寻呼机中打开文件,如下所示:
less /etc/passwd
此文件中的每一行都包含有关不同用户的信息。在第一列中找到您的用户和根用户,以冒号 (:) 分隔。在最后一个字段中,将列出该用户的默认登录 shell:
root:x:0:0:root:/root:/bin/bash
. . .
demouser:x:1000:1000:,,,:/home/demouser/bin/bash
如果最后一个字段是 /bin/bash
,那么您已经准备就绪。
如果最后一个字段不是 /bin/bash
并且您希望将默认 shell 更改为 Bash,您可以使用 root 权限编辑此文件并更改与您的用户:
sudo nano /etc/passwd
进行更改后,注销并重新登录以使用 Bash shell。
查看当前值
首先,让我们探索配置文件中已有的内容来定义 Bash 提示。
Bash 使用 PS1
和 PS2
环境变量配置其提示符。
PS1 定义您将看到的主要提示。每次登录时都会看到它。默认情况下,在 Ubuntu 系统中,它应该采用以下形式:
<前>
请注意末尾的 $
。这表示该 shell 是普通用户 shell。对于 root 用户,这将替换为 #
以区分并让您知道您正在使用提升的权限进行操作。
PS2 提示符用于多行命令。您可以通过在终端中键入以下内容来查看当前 PS2 变量的设置:
echo \
在反斜杠后直接按回车键可以看到提示。默认情况下,在 Ubuntu 中,这是 >
。
通常,我们定义这些变量将保存在我们的 ~/.bashrc
文件中,该文件在我们的交互式 shell 启动时被读取。
在 Ubuntu 12.04 上的这个文件中,我们可以找到这样的部分:
# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
# force_color_prompt=yes
if [ -n "$force_color_prompt" ]; then
if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
# We have color support; assume it's compliant with Ecma-48
# (ISO/IEC-6429). (Lack of such support is extremely rare, and such
# a case would tend to support setf rather than setaf.)
color_prompt=yes
else
color_prompt=
fi
fi
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt
我们可以看到一些逻辑指示何时将提示着色。如果您想要彩色提示,您需要取消注释 force_color_prompt=yes
行。现在执行此操作以利用我们稍后将进行的自定义。
force_color_prompt=yes
我们关心的部分是设置提示的部分。它嵌套在一个 if-else 结构中,根据您是否使用颜色给出不同的提示:
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt
顶部增加了颜色支持。我们先看第二节,不用颜色先掌握一些基础知识:
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
这看起来相当复杂,有些部分似乎与我们在正常 shell 用法中看到的任何内容都不匹配。
包含debian_chroot
的部分表示如果您是在更改root环境下操作,会修改提示以提醒您。您可能希望完整保留这部分提示,因为这是一个有用的功能。
提示定义的其余部分如下所示:
\u@\h:\w\$:
这描述了我们一直看到的主要提示,使用了一些转义序列。
Bash 转义序列
我们可以在 Bash 手册页中找到可能的转义序列的完整列表:
<前>
如您所见,有一些基本信息和一些您可能不需要的信息(ASCII 铃字符、Bash 版本等)。
我们现在的提示有用户名 (\u)、@ 符号、主机名的第一部分 (\h)、当前工作目录 (\w),最后是普通用户的 \$和\“#”代表根用户。
让我们退出 ~/.bashrc
文件,以便我们可以测试其他一些选项。
测试新的 Bash 提示符
虽然最终我们想要编辑我们的 ~/.bashrc
文件以使我们的选择永久化,但从命令行本身更改提示进行试验要容易得多。
在我们开始修改之前,让我们将 PS1
的当前值保存到一个新变量中。这将使我们能够更轻松地切换回原始提示,而无需注销并重新登录以防我们犯错。
ORIG=$PS1
现在,我们有一个名为 ORIG
的环境变量,它将保存默认提示的副本。
如果我们需要切换回原来的提示符,我们可以输入:
PS1=$ORIG
让我们从简单的开始,让我们的用户名和实际提示的 $
开始:
PS1="\u$"
我们应该得到这样的东西:
demouser$
让我们留一点空间让它看起来更好看:
PS1="\u $: "
demouser $:
虽然我们可能不想使用 \$文字字符。我们应该使用 \$
转义序列来代替。这将根据我们是否是 root 动态修改提示,允许我们的 PS1 正确用作 root:
PS1="\u \$: "
我们可以在提示中添加我们想要的任何文字字符串:
PS1="Hello, my name is \u! \$: "
Hello, my name is demouser! $:
我们还可以使用常规 shell 功能插入任意命令的结果。
在这里,我们可以通过使用反引号提取在 /proc/loadavg
中找到的负载指标的第一列来插入命令的结果,从而让我们的提示给出服务器的当前负载:
PS1="\u, load: `cat /proc/loadavg | awk '{ print $1; }'` \$: "
demouser, load: 0.01 $:
这是了解您是否正在对系统征税的好方法。
如果日期或时间对您的提示很重要,您可以尝试这样的事情。让我们也用一些方括号和圆括号将我们的数据分开一些,以保持它的组织性。我们还要添加 \w
以跟踪我们的工作目录:
PS1="[\u@\h, load: `cat /proc/loadavg | awk '{ print $1; }'`] (\d - \t) \w \$ "
[demouser@host, load: 0.01] (Thu Feb 20 - 13:15:20) ~ $
这开始变得有点笨拙,尤其是当我们将目录更改为路径较长的内容时:
cd /etc/systemd/system/multi-user.target.wants
[demouser@host, load: 0.01] (Thu Feb 20 - 13:18:28) /etc/systemd/system/multi-user.target.wants $
如果我们仍然想要所有这些信息,但想让它更短,一种策略是用 将信息分成两行
换行符:
PS1="[\u@\h, load: `cat /proc/loadavg | awk '{ print $1; }'`] (\d - \t)\n\w \$ "
[demouser@host, load: 0.00] (Thu Feb 20 - 13:20:00)
/etc/systemd/system/multi-user.target.wants $
有些人不喜欢多行提示,但这是在提示中提供更多信息的一种方式。
更改提示颜色
现在我们已经很好地掌握了影响提示的不同方式,让我们尝试一些着色。
Bash 允许您使用特殊代码将颜色引入提示中。这些通常是混淆的根源,因为所选代码的描述性不强。
在我们讨论实际的颜色代码之前,我们应该先谈谈我们是如何实际实现它们的。在 Bash 设置中定义颜色代码有正确和错误的方法。
首先,您必须将整个颜色代码描述包含在 \[
和 \]
标签中。这些括号向 bash 表明存在于第一个序列之后直到最后一个序列的字符应被视为非打印字符。
Bash 需要知道这一点,以便它可以估计在换行到下一行之前要打印多少个字符。如果您没有将颜色代码包含在 \[
和 \]
标记中,Bash 会将所有字符都计为文字字符,并且会过早换行。
其次,在括号非打印序列内,您需要通过键入 [
或 [
来指定颜色提示的开头。它们都做同样的事情并指示转义序列的开始。我将在本指南中使用 [
因为我认为它更清晰一些。
在 \]
之前,您需要一个 \m 来表示您正在给出一个颜色序列。
所以基本上,每次我们想要修改颜色时,我们都必须在提示中输入如下内容:
<前>
如您所见,这是使我们的提示特别混乱的部分。
至于颜色代码,更改前景文本颜色的基本代码如下:
- 30:黑色
- 31:红色
- 32:绿色
- 33:黄色
- 34:蓝色
- 35:紫色
- 36:青色
- 37:白色
您还可以通过在基值前设置一个“属性”来修改这些基值,以分号 (;) 分隔。
根据您使用的终端类型,它们的行为可能会大不相同。一些更常见的属性是:
- 0:普通文本
- 1:粗体或浅色,取决于终端
- 4:下划线文字
所以如果你想要带下划线的绿色文本,你可以使用这样的序列:
\[\e[4;32m\]
然后我们将输入我们想要的提示。之后,我们可能希望将颜色重置回其原始值,以便我们在终端中键入的文本不会出现奇怪的颜色。
我们可以通过使用另一个颜色代码来完成此操作,该颜色代码指示 Bash 应该重置提示颜色。这段代码是:
\[\e[0m\]
因此,带有用户名和主机的简单彩色提示可能如下所示:
PS1="\[\e[4;32m\]\u@\h\[\e[0m\]$ "
我们还可以指定背景颜色以增加复杂性。背景颜色不能带属性。他们是:
- 40:黑色背景
- 41:红色背景
- 42:绿色背景
- 43:黄色背景
- 44:蓝色背景
- 45:紫色背景
- 46:青色背景
- 47:白色背景
尽管您可以像这样一次性指定背景颜色、属性和文本颜色:
\[\e[42;1;36m\]
如果将背景信息与其他信息分开,通常效果会更好:
\[\e[42m\]\[\e[1;36m\]
有时,如果您只是使用 \normal 文本属性 (0),着色在某些终端中会出现乱码。您可以通过不指定带有 0 的正常值来避免这种情况,因为无论如何它都是默认值。
使您的即时更改永久化
现在我们已经尝试了一段时间的提示,我们应该对我们希望提示的外观有一个很好的了解。您应该能够创建彩色提示和非彩色提示。
对于我们的示例,我们将使用以下彩色提示:
PS1="[\[\e[0;32m\]\u@\h, load: `cat /proc/loadavg | awk '{ print $1; }'`\[\e[00m\]] (\[\e[00;35m\]\d - \t\[\e[00m\])\n\w \$ "
我们也将使用它的非彩色等效项,因为当我们不希望有彩色 bash 提示符时:
PS1="[\u@\h, load: `cat /proc/loadavg | awk '{ print $1; }'`] (\d - \t)\n\w \$ "
现在我们已经有了所需的两个版本的提示,我们可以在 ~/.bashrc
文件中编辑 PS1
。
nano ~/.bashrc
正如我们在开始时所讨论的,我们文件中的提示现在包含了一些功能,可以在我们处于 chroot 环境中时使其显而易见。让我们留下那部分。现在看起来像这样:
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt
注释掉当前的 PS1
分配并复制下面的 debian_chroot
逻辑,使其看起来像这样:
<前>
在提示的末尾,就在最后一个报价结束之前,我们可以添加我们想要实现的提示。实际上,由于我们的提示使用单引号,我们希望更改当前提示中的引号类型以使用双引号。
在第一个 PS1
作业中,使用提示的彩色版本。第二种,使用无色的。
<前>
完成后,我们可以关闭并保存文件。
现在,当您注销并重新登录时,您的提示将更改为您设置的值。
结论
您可以通过许多不同的方式来个性化您的配置。为某些项目着色可以使它们脱颖而出,并且可以帮助您在滚动浏览终端历史记录时找到最后一个提示。
另一个流行的想法是为 root 用户提供一个特殊的提示,这样对比就会提醒你你的特权。发挥创意并尝试在有用信息和混乱之间找到适合您的平衡点。