Linux--定制提示符

本文介绍如何自定义Linux shell提示符,包括分解默认提示符、设计个性化提示符、添加颜色、移动光标及保存提示符的方法。


shell提示符,通过学习,我们会发现shell和终端仿真器程序的内部工作机制。
和Linux中的很多程序一样,shell提示符的可配置性很高,尽管大多数用户并不重视提示符,但是,一旦我们学会了怎样控制它,它就会成为一种相当有用的设备。


一、提示符的分解

系统的默认提示符看起来如下所示:

[wangjichuan@mr.jarvis ~]$

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

[wangjichuan@mr.jarvis ~]$ echo $PS1
[\u@\h \w]\$

注意:如果看到的结果与上面不一样,也不需要担心。每一个Linux发行版对此提示符字符串都会有所不同,有一些甚至定义得很奇怪。

可以看到,PS1包含了一些提示符中出现的字符,比如方括号、@符合和美元符号,但是其余的部分则很让人困惑。这些符号可以参考下表:

shell提示符中使用的转义字符

转义字符含义
\aASCII铃声。在遇到该转义字符时,计算机发出哔哔声
\d 当前日期,以星期、月、日的形式表示,如“Mon May 26”
\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会话中输入的命令数
\$在非管理员权限下输出“$”,在管理员权限下输出“#”
\[ 标志一个或多个非打印字符序列的开始。用于嵌入非打印的控制字符,使其以一定方式操纵终端仿真器,比如移动光标或更改文本颜色
\]标志着非显示字符序列的结束

二、尝试设计提示符

通过这个特殊字符列表,我们可以更改提示符来查看效果。我们首先备份现有的字符串,一边过后进行恢复。为此,将现有的字符串复制到我们创建的另外一个shell变量中。

[wangjichuan@mr.jarvis ~]$ ps1_old=$"PS1"

这样我们就创建了名为ps1_old的新变量,并将PS1的值赋给ps1_old。我们可以使用echo命令来验证PS1的值确定以及被复制了。

[wangjichuan@mr.jarvis ~]$ echo ps1_old
[\u@\h \w]\$

在终端会话中,用户随时可以通过这个过程的逆操作来复原最初的提示符。

[wangjichuan@mr.jarvis ~]$ PS1="$ps1_old"

现在一切准备就绪,接下来我们就可以自己DIY提示符了,参考上面的表格,例如:

[wangjichuan@mr.jarvis ~]$ PS1="\[\u@\w\]\a"

上面的修改只是在最后加了\a,效果是每次提示符出现都会哔一声。


三、添加颜色

大多数终端都会响应某些非打印字符序列,来控制光标的位置、字符属性(如颜色、粗体、文本闪烁等)等内容。
字符颜色是由发送到终端仿真器的一个ANSI转义代码来控制的,该转义代码嵌入到了要显示的字符流中。控制代码不会“打印”到屏幕上,而是被终端解释为一条指令。从上转义字符表中可以看到,\[\]这两个序列用来封装非打印字符串。一个ANSI转义代码以八进制033(该代码由转义键[escape key]产生)开始,后面跟着一个可选的字符属性,之后是一条指令。例如,将文本颜色设置为正常(attribute=0)、黑色的代码是\033[0;30m。
下表列出了可用的文本颜色。需要注意的是,这些颜色分为两组,区别在于是否应用了粗体(bold)属性(1),这个属性使得色彩分为深色和浅色。

设置文本颜色的转义序列

字符系列文本颜色
\033[0;30m黑色
\033[0;31m红色
\033[0;32m 绿色
\033[0;33m 棕色
\033[0;34m 蓝色
\033[0;35m 紫色
\033[0;36m 青色
\033[0;37m 淡灰色
\033[1;30m 深灰色
\033[1;31m 淡红色
\033[1;32m 淡绿色
\033[1;33m 黄色
\033[1;34m 淡蓝色
\033[1;35m 淡紫色
\033[1;36m 淡青色
\033[1;37m 白色
现在让我们尝试创造红色的提示符。我们将相应的转义代码插入提示符的开端。
[wangjichuan@mr.jarvis ~]$ PS1="\[\033[0;31m\]<\u@\h \W>\$ "

事实证明操作是可行的,但是此时用户输入的所有文字也变成红色了。要修复这个问题,可以在提示符的末尾插入另一条转义码,以通知终端仿真器恢复到原来的颜色。

[wangjichuan@mr.jarvis ~]$ PS1="\[\033[0;31m\]<\u@\h \W>\$\[\033[0m\] "

下表列出了可用的背景颜色,背景颜色不支持粗体属性。

设在背景颜色的转义序列

字符系列背景颜色
\033[0;40m黑色
\033[0;41m红色
\033[0;42m 绿色
\033[0;43m棕色
\033[0;44m蓝色
\033[0;45m紫色
\033[0;46m青色
\033[0;47m淡灰色
通过为第一个转义代码做一些修改,就可以创建带有红色背景的提示符。
[wangjichuan@mr.jarvis ~]$ PS1="\[\033[0;41m\]<\u@\h \W>\$\[\033[0m\] "

注意:文本除了正常(0)和粗体(1)属性外,还可以设置为下划线(4)、闪烁(5)和斜体(7)


四、移动光标

转义代码也可以用来定位光标。比如在提示符出现的时候,这些转义代码通常用来在屏幕的不同位置(比如屏幕上方的一角)显示一个时钟或者其他信息。

光标移动转义序列

转义码动作
\033[1;cH将光标移动之1行c列
\033[nA将光标向上移动n行
\033[nB将光标向下移动n行
\033[nC 将光标向前移动n个字符
\033[nD将光标向后移动n个字符
\033[2J清空屏幕并将光标移动至左上角(第0行第0列)
\033[K清空当前光标位置到行末的内容
\033[s存储当前光标位置
\033[u 恢复之前存储的光标位置
通过使用这些代码,用户可以构建这样的一条提示符。每当提示符出现时,屏幕的上方绘制出一个红色的横条,横条中有用黄色文本显示的时间。用于提示符的编码就算一个看起来很可怕的字符串:
[wangjichuan@mr.jarvis ~]$ PS1="\[\033[s\033[0;0H\033[0;41m\033[K\033[1;33m\t\033[0m\033[u\]<\u@\h \W>\$ "

分解上诉复杂提示符

字符序列动作
\[开始一个非打印字符序列。其真正的目的是为了让bash正确计算可见提示符的长度。如果没有该字符,命令行编辑功能无法正确定位光标
\033[s存储光标位置,在屏幕的顶部横条绘制完成并显示时间后,读取并使光标返回此位置。需要注意的是,一些终端仿真器不支持该代码
\033[0;0H将光标移动至左上角,即第0行第0列
\033[0;41m将背景颜色设置为红色
\033[K将光标当前位置(左上角)到行末的内容清空。因为现在背景颜色已经是红色了,所以清空后的行就是红色,也就是绘制了红色的横条。需要注意的是,清空行的内容并不会改变光标的位置,光标仍处于屏幕左上角
\033[1;33m设置文本颜色为黄色
\t显示当前时间。尽管这是一个可打印的元素,但所还是将其包含在提示符非打印部分中,这是因为bash在计算可见提示符的长度时,不应当将其计算在内
\033[0m关闭颜色。对文本和背景均有效
\033[u恢复之前存储的光标位置
\]结束非打印的字符序列
<\u@\h \W>\$提示符字符串

五、保存提示符

很显然,用户不会想要每次都输入这样一长串代码,所以就需要将提示符存储在某个地方。将提示符添加到.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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贝勒里恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值