第十三章: 定制提示符

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 的好文章:

http://en.wikipedia.org/wiki/ANSI_escape_code

results matching ""

    No results matching ""