第十三章: 定制提示符
13.1 提示符的分解
系统默认的提示符如下:
soren@soren-ubuntu16:~$
在提示符中包含了用户名, 主机名和当前的工作目录. 提示符是由名为PS1的环境变量定义的.
shell提示符中使用的转义字符如下表:
转义字符 | 含义 |
---|---|
\a | ASCII铃声 |
\d | 当前日期, 用星期, 月, 日的形式显示 |
\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会话中输入的命令数 |
\$ | 在非管理员权限下输出[$], 管理员权限下输出[#] |
\[ | 标志一个或多个非打印字符序列的开始, 用于嵌入非打印的控制字符, 比如移动光标或更改文本颜色 |
\] | 标志着非显示字符序列的结束 |
13.2 尝试设计提示符
ps1_old="$PS1"
echo $ps1_old
PS1="\$ "
$ PS1="\A \H \$ "
12:48 soren-ubuntu16 $
PS1="<\u@\h \W>\$ "
PS1="$ps1_old"
13.3 添加颜色
字符颜色是由发送到终端仿真器的一个ASNI转义代码来控制的, 该转义代码嵌入到了要显示的字符流中. 控制代码不会打印到屏幕上, 而是被终端解释为一条指令, [\[] 和 [\]] 这两个序列用来封装非打印字符串.
一个ANSI转义代码以八进制033(由转义键escape key 产生)开始, 后面跟着一个可选的字符属性, 之后是一条指令. 例如将文本颜色设置为正常(attribute=0), 黑色的代码是 \033[;30m .
设置文本颜色的转义序列如下表:
字符序列 | 文本颜色 |
---|---|
\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 | 白色 |
例如, 将提示符修改为红色, 然后将用户输入的文字恢复到原来的颜色:
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 | 淡灰色 |
例如, 将提示符修改为红色背景, 然后将用户输入的文字恢复到原来的颜色:
PS1="\[\033[0;41m\]<\u@\h \W>\$\[\033[0m\] "
注意, 文本除了正常(0) 和粗体(1) 属性外, 还可以设置为下划线(4), 闪烁(5)和斜体(7), 但是有些终端仿真器拒绝使用闪烁属性.
13.4 移动光标
转义代码也可以用来定位光标, 比如在屏幕的不同位置显示一个时钟或其他信息.
光标移动的转义序列如下表:
转义码 | 动作 |
---|---|
\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 | 恢复之前存储的光标位置 |
例如, 当提示符出现时在屏幕的上方绘制一个红色的横条, 用黄色文本显示时间:
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 | 清空第0行的内容 |
\033[1;33m | 设置文本颜色为黄色 |
\t | 显示当前时间 |
\033[0m | 恢复之前的背景颜色和文本颜色 |
\033[u | 恢复之前存储的光标位置 |
\] | 结束非打印的字符序列 |
<\u@\h \W>\$ | 提示符字符串 |
13.5 保存提示符
将提示符存储到 .bashrc 文件中就可以避免每次都输入一长串的代码.
13.6 扩展阅读
来自于 Linux 文档工程, 对 shell 提示符的用途进行了相当完备的论述. 可在以下链接中得到:
http://tldp.org/HOWTO/Bash-Prompt-HOWTO/
- Wikipedia 上有一篇关于 ANSI Escape Codes 的好文章: