开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第15天,点击查看活动详情
前言
和 Linux 内的许多程序一样,shell 提示符是可高度配置的,虽然我们把它相当多地看作是理所当然的,但是我们一旦学会了怎样控制它,shell 提示符是一个真正有用的设备。
一、定制 shell 提示符
1.1 解剖一个提示符
我们默认的提示符看起来像这样:
[me@linuxbox ~]$
注意:
它包含我们的用户名,主机名和当前工作目录,但是它又是怎样得到这些东西的呢?
结果证明非常简单。
提示符是由一个环境变量定义的,叫做 PS1(是“prompt string one”的简写)。
我们可以通过 echo 命令来查看 PS1 的内容。
[me@linuxbox ~]$ echo $PS1
[\u@\h \W]\$
注意:如果你 shell 提示符的内容和上例不是一模一样,也不必担心。每个 Linux 发行版定义的提示符稍微有点不同,其中一些相当异乎寻常。
从输出结果中,我们看到那个 PS1 环境变量包含一些这样的字符,比方说中括号,@ 符号,和美元符号,但是剩余部分就是个谜。我们中一些机敏的人会把这些看作是由反斜杠转义的特殊字符,就像我们在第八章中看到的一样。
这里是一部分字符列表,在提示符中 shell 会特殊对待这些字符:
1.2 试试一些可替代的提示符设计
参照这个特殊字符列表,我们可以更改提示符来看一下效果。首先,我们把原来提示符字符串的内容备份一下,以备之后恢复原貌。为了完成备份,我们把已有的字符串复制到另一个shell 变量中,这个变量是我们自己创造的。
[me@linuxbox ~]$ ps1_old="$PS1"
我们新创建了一个叫做 ps1 old 的变量,并把变量 PS1 的值赋 ps1 old。通过 echo 命令可以证明我们的确复制了 PS1 的值。
[me@linuxbox ~]$ echo $ps1_old
[\u@\h \W]\$
在终端会话中,我们能在任一时间复原提示符,只要简单地反向操作就可以了。
[me@linuxbox ~]$ PS1="$ps1_old"
1.3 添加颜色
大多数终端仿真器程序支持一定的非打印字符序列来控制,比方说字符属性(像颜色,黑体和可怕的闪烁)和光标位置。
字符颜色是由发送到终端仿真器的一个嵌入到了要显示的字符流中的 ANSI 转义编码来控制的。这个控制编码不会“打印”到屏幕上,而是被终端解释为一个指令。
正如我们在上表看到的字符序列,这个 [和] 序列被用来封装这些非打印字符。
一个 ANSI 转义编码以一个八进制 033(这个编码是由退出按键产生的)开头,其后跟着一个可选的字符属性,在之后是一个指令。
例如,把文本颜色设为正常(attribute = 0),黑色文本的编码如下:
\033[0;30m
这里是一个可用的文本颜色列表。
注意这些颜色被分为两组,由应用程序粗体字符属性(1)分化开来,这个属性可以描绘出“浅”色文本。
让我们试着制作一个红色提示符。我们将在开头加入转义编码:
<me@linuxbox ~>$ PS1='\[\033[0;31m\]<\u@\h \W>\$'
<me@linuxbox ~>$
我们的提示符生效了,但是注意我们在提示符之后输入的文本也是红色的。
为了修改这个问题,我们将添加另一个转义编码到这个提示符的末尾来告诉终端仿真器恢复到原来的颜色。
<me@linuxbox ~>$ PS1='\[\033[0;31m\]<\u@\h \W>\$\[\033[0m\]'
<me@linuxbox ~>$
也有可能要设置文本的背景颜色,使用下面列出的转义编码。这个背景颜色不支持黑体属性。
我们可以创建一个带有红色背景的提示符,只是对第一个转义编码做个简单的修改。
<me@linuxbox ~>$ PS1='\[\033[0;41m\]<\u@\h \W>\$\[\033[0m\] '
注意:
- 除了正常的 (0) 和黑体 (1) 字符属性之外,文本也可以具有下划线 (4),闪烁 (5),和反向 (7) 属性。
为了拥有好品味,然而,许多终端仿真器拒绝使用这个闪烁属性。
1.4 移动光标
转义编码也可以用来定位光标。
这些编码被普遍地用来,每次当提示符出现的时候,会在屏幕的不同位置比如说上面一个角落,显示一个时钟或者其它一些信息。
这里是一系列用来定位光标的转义编码:
使用上面的编码,我们将构建一个提示符,每次当这个提示符出现的时候,会在屏幕的上方画出一个包含时钟(由黄色文本渲染)的红色长条。
提示符的编码就是这个看起来令人敬畏的字符串:
PS1='\[\033[s\033[0;0H\033[0;41m\033[K\033[1;33m\t\033[0m\033[u\]
<\u@\h \W>\$ '
1.5 保存提示符
显然地,我们不想总是敲入那个怪物,所以我们将要把这个提示符存储在某个地方。
通过把它添加到我们的.bashrc 文件,可以使这个提示符永久存在。
为了达到目的,把下面这两行添加到.bashrc 文件中。
PS1='\[\033[s\033[0;0H\033[0;41m\033[K\033[1;33m\t\033[0m\033[u\]<\u@\h \W>\$ '
export PS1
总结
这一节 主要就是使用PS1变量去修改提示符的样式:
- 更改文本颜色
- 更改提示符背景
- 保存提示符样式 通过设置到启动脚本中