Top

D10:配置和环境之三

自定义提示符

学习shell提示符可以揭示shell和终端仿真程序的一些内部工作原理。
目录:

提示符剖析

bash默认的提示符看起来像这样:
[me@linuxbox ~]$
它包含当前用户名、主机名、当前工作目录。它是由PS1环境变量定义的。使用以下命令可以查看PS1的内容:
[me@linuxbox ~]$ echo $PS1
[\u@\h \W]\$
每个Linux定义的提示符都有可能会有一些差异,甚至有些相当离奇。
以下是bash在提示符中特别处理的字符的部分列表:
序列 显示的值
\a ASCII表中的响铃
这会使计算机在遇到问题时发出哔哔的声音。
\d 以星期、月、日格式显示当前日期,例如:“Mon May 26”。
\h 不带域名的本地主机名
\H 完整的主机名
\j 当前shell会话中运行的作业数
\l 当前终端设备的名称
\n 换行符。
实际上是“回车+新行”
\r 回车,但不换行,也就是回到行首
\s shell程序的名称
\t 24小时制的时间,格式为 小时:分钟:秒
\T 12小时制的时间
\@ AM/PM格式的12小时制时间
\A 24小时制的时间,格式为 小时:分钟
\u 当前用户的用户名
\v shell的版本号
\V shell的版本和发布号
\w 当前工作目录的名称
\W 当前工作目录的名称的最后一部分
\! 当前命令的历史序号
\# 在此shell会话期间输入的命令数
\$ 对于普通用户,显示$;对于超级用户,显示#
\[ 表示一个或多个非打印字符序列的开始。
这用于嵌入非打印控制字符,以某种方式操纵终端模拟器,例如移动光标或更改文本颜色。
\] 表示一个非打印字符序列的结束。

尝试替换提示符设计

首先要先备份现有的提示字符串。以下命令创建一个新变量ps1_old,并将PS1的值传递给它:
[me@linuxbox ~]$ ps1_old="$PS1"
使用以下命令核对一下:
[me@linuxbox ~]$ echo $ps1_old
[\u@\h \W]\$
替换提示符可使用以下命令:
$ PS1="\A \h \$"
17:33 linuxbox $

添加颜色

大多数终端模拟程序可以响应某些非打印字符序列,以控制字符属性(如颜色、粗体文本和可怕的闪烁文本)和光标的位置。
早期的终端多种多样,类Unix由两个相当复杂的子系统处理它们——tremcap和terminfo。
为了让终端使用某种通用语言,美国国家标准协会(ANSI)发布了一套标准的字符序列来控制视频终端,当年DOS用的是ANSI.SYS文件。

通过向终端仿真器发送嵌入待显示字符流中的ANSI转义码可以控制字符颜色。
控制代码不会显示在屏幕上,它会被终端解释为一条指令。
ANSI转义码以八进制033开头(被Esc键定义),后跟可选字符属性,再跟指令。例如,将文本颜色设置为“正常”(属性(attribute)=0)、黑色文本的代码如下:
\033[0;30m
可用的颜色代码如下表:
序列 文本颜色 序列 文本颜色
\033[0;30m \033[1;30m 暗灰
\033[0;31m \033[1;31m 亮红
\033[0;32m 绿 \033[1;32m 亮绿
\033[0;33m 黄(原文为Brown) \033[1;33m 亮黄
\033[0;34m \033[1;34m 亮蓝
\033[0;35m \033[1;35m 亮紫
\033[0;36m \033[1;36m 亮青
\033[0;37m \033[1;37m
以下实例:
$ PS1="\[\033[0;31m\]<\u@\h \W>\$ "
<me@linuxbox ~>$
但是,执行完以上命令后,所有显示的内容都将是红色。为了解决这个问题,可以再末尾添加另一个转义代码,告诉终端仿真器使用另一种颜色:
<me@linuxbox ~>$ PS1="\[\033[0;31m\]<\u@\h \W>\$\[\033[0m\] "
<me@linuxbox ~>$

还可以设置文本的背景色,颜色代码如下:
序列 底色 序列 底色
\033[0;40m \033[0;44m
\033[0;41m \033[0;45m
\033[0;42m 绿 \033[0;46m
\033[0;43m \033[0;47m 亮灰
字符属性除了正常(normal(0))和亮体(原文用的是粗体bold(1)),以外,还可能具有下划线(underscore(4))、闪烁(blinking(5))、反转(inverse(7))。
但多数终端仿真器拒绝接受闪烁属性。

移动光标

转义码可用于定位光标。这通常用于在屏幕上的不同位置提供时钟或其他类型的信息。
下表列出定位光标的转义码:
转义码 动作
\033[l;cH 移动光标到第l行第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>\$ "

保存提示符

修改的提示符样式会在关闭shell会话之后失效。要想使其“永久”生效,可以将相应代码加到.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