本章将会讲解一个看似微不足道的细节:shell 提示符。通过学习 shell提示符,我们会发现 shell 和 终端仿真器程序的内部工作机制。
和Linux中的很多程序一样,shell 提示符的可配置性很高。
尽管大多数用户并不重视提示符,但是一旦我们学会了怎样控制它,它就会成为一种相当有用的设备。(准)
一、提示符的分解
1.提示符的构成
系统的默认 shell 提示符看起来如下:

可以看到 shell 提示符中包含了用户名、主机名 和 当前的工作目录,但是为什么 shell 提示符是这样子的呢?
很简单,提示符就是这样定义的。
(1)环境变量PS1(为什么?)
提示符是由名为PS1的环境变量定义的(PS1:是prompt string 1的缩写,即提示符字符串1)。
① 查看PS1
echo 命令可以帮助用户看到 PS1 的值。
echo $PS1

可以看出,PS1 包含了一些提示符中出现的符号,比如:方( [] )括号,@ 符号和美元($)符号,但是其余的部分则很令人困惑。
这就需要将这些符号与下表中所示的 由反斜杠转义 的特殊字符联系起来。
Ⅰ.注意
如果你的输出结果和上图范例有所不同,不要担心。
因为每一个 Linux 发行版本对此提示符字符串的定义都会有所不同,有一些甚至定义得很奇怪。
② shell提示符中使用的转义字符(准)
转义字符 | 含义 |
---|---|
\a | ASCⅡ 铃声。在遇到此转义字符时,计算机发出哔哔声。 |
\d | 当前日期,以星期、月、日的形式表示。如:Sun August 9(星期六 8月9日)。 |
\h | 本地机器的主机名,但不带域名。(简单说,不带域名的主机名) |
\H | 完整的主机名。 |
\j | 当前 shell 会话中进行的任务个数。 |
\l | 当前终端设备的名称。 |
\n | 换行符。 |
\r | 回车符。 |
\s | shell 程序的名称。 |
\t | 当前时间(24小时制),格式:小时: 分钟: 秒 |
\T | 当前时间(12小时制)。 |
@ | 当前时间(12小时制),格式: AM/PM |
\A | 当前时间(24小时制),格式:小时:分钟 |
\u | 当前用户的用户名。 |
\v | shell 的版本号。 |
\V | shell 的版本号和发行号。 |
\w | 当前工作目录名。 |
\W | 当前工作目录名的最后一部分。 |
\ ! (注意:这个及以下字符间都没有空格,不加空格两字符都无法显示) | 当前命令的历史编号。 |
\ # | 当前 shell 会话中输入的命令数。 |
\ $ | 在非管理员权限下输出“ $ ”。在管理员权限下输出“ # ”。 |
\ [ | 标志一个或多个非打印字符序列的开始。用于嵌入非打印的控制字符,使其以一定方式操纵终端仿真器,比如移动光标 或 更改文本颜色。 |
\ ] | 标志着非显示字符序列的结束。 |
二、尝试设计提示符
通过上面这个特殊字符列表,我们可以更改提示符来查看效果。
1.先备份
在尝试设计前,我们首先备份现有的字符串,以便过后进行恢复。为此,将现有的字符串复制到我们创建的另外一个shell变量中,
ps1_old="$PS1"
这样我们就创建了名为 ps1_old 的新变量,并将 PS1 的值赋给了 ps1_old。
现在就可以使用 echo 命令来验证 PS1 的值确实已经被复制了。
echo $ps1_old
(1)复原
在终端会话中,用户随时可以通过以下这个过程的逆操作来复原最初的提示符。
PS1="$ps1_old"
在这里不用 ps1_old 进行设计的原因是:PS1 在系统中已经是环境变量,而 ps1_old 还不是系统变量,若是对 ps1_old 进行操作,还得将其先加入到环境变量中。
2.设计(怎么做?)
(1)提示符为空
现在一切,让我们看看,如果提示符为空会发生什么。
PS1=
若提示符为空,那么用户不会得到任何提示。因为根本就没有提示字符串。
尽管提示符就在那里,但是系统并不会显示,这样的提示符看起来很不得劲,所以现在将提示符设置为最简略的内容。
PS1="\$"
这样就好多了,至少现在用户知道自己在做什么了,可以注意到双引号中末尾的空格。
当显示提示符时,这空格会把美元符号和光标分隔开。
(2)添加铃声
在提示符中添加一个铃声,这样一来,每当系统显示提示符的时候,用户都会听到哔哔声。
PS1="\a\$ "
虽然听多了可能会让我们感到厌烦,但是在一些情况下可能会很有帮助,比如可以在一个耗时特别长的命令执行完毕时通知用户。
(3)添加主机名、当天时间
接下来,试着创建一个信息更为丰富的提示符,比如说一个包括主机名和当天的时间信息的提示符。
PS1="\A \h \$ "
① 小技巧
如果我们需要记录某些任务的执行时间,在提示符中添加时间信息会比较有用。
(4)定制最初样式的提示符
PS1="<\u@\h \W>\$ "
这时你就会发现,此时的提示符变成了 <当前用户的用户名@不带域名的主机名 当前工作目录的最后一部分>$空格。
这和最初样式的提示符类似。
也可用上表中的其它序列,自由组合,看看能创造出一个怎样的提示符。
网友评论