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