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