PS1环境变量用于定制提示符。它可以使用一些转义字符。
$ echo $PS1
[\u@\h \W]\$可以看到,PS1包含了一些转义字符。
- \a 以 ASCII 格式编码的铃声 . 当遇到这个转义序列时,计算机会发出嗡嗡的响声。
- \d 以日,月,天格式来表示当前日期。例如,“Mon May 26.”
- \h 本地机的主机名,但不带末尾的域名。
- \H 完整的主机名。
- \j 运行在当前 shell 会话中的工作数。
- \l 当前终端设备名。
- \n 一个换行符。
- \r 一个回车符。
- \s shell 程序名。
- \t 以24小时制,hours:minutes:seconds 的格式表示当前时间.
- \T 以12小时制表示当前时间。
- @ 以12小时制,AM/PM 格式来表示当前时间。
- \A 以24小时制,hours:minutes 格式表示当前时间。
- \u 当前用户名。
- \v shell 程序的版本号。
- \V Version and release numbers of the shell.
- \w 当前工作目录名。
- \W 当前工作目录名的最后部分。
- ! 当前命令的历史号。
- # 当前 shell 会话中的命令数。
- $ 这会显示一个"$"字符,除非你拥有超级用户权限。在那种情况下, 它会显示一个"#"字符。
\[标志着一系列一个或多个非打印字符的开始。这被用来嵌入非打印 的控制字符,这些字符以某种方式来操作终端仿真器,比方说移动光标或者是更改文本颜色。\]标志着非打印字符序列结束。
\033[0;30m黑色\033[1;30m深灰色\033[0;31m红色\033[1;31m浅红色\033[0;32m绿色\033[1;32m浅绿色\033[0;33m棕色\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>\$'但是,提示符之后输入的文本也是红色的。为了修改这个问题, 我们将添加另一个转义编码到这个提示符的末尾来告诉终端仿真器恢复到原来的颜色。
PS1='\[\033[0;31m\]<\u@\h \W>\$\[\033[0m\]'背景颜色。
\033[0;40m蓝色\033[1;44m黑色\033[0;41m红色\033[1;45m粉红\033[0;42m绿色\033[1;46m青色\033[0;43m棕色\033[1;47m浅灰色
下面是一个带有红色背景的提示符。
PS1='\[\033[0;41m\]<\u@\h \W>\$\[\033[0m\] '\033[l;cH把光标移到第 l 行,第 c 列。\033[nA把光标向上移动 n 行。\033[nB把光标向下移动 n 行。\033[nC把光标向前移动 n 个字符。\033[nD把光标向后移动 n 个字符。\033[2J清空屏幕,把光标移到左上角(第零行,第零列)。\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把光标移到屏幕左上角,也就是第零行,第零列的位置。\033[0;41m把背景设置为红色。\033[K清空从当前光标位置到行末的内容。因为现在背景颜色是红色,则被清空行背景成为红色,以此来创建长条。注意虽然一直清空到行末, 但是不改变光标位置,它仍然在屏幕左上角。\033[1;33m把文本颜色设为黄色。\t显示当前时间。虽然这是一个可“打印”的元素,但我们仍把它包含在提示符的非打印部分, 因为我们不想 bash 在计算可见提示符的真正大小时包括这个时钟在内。\033[0m关闭颜色设置。这对文本和背景都起作用。\033[u恢复到之前保存过的光标位置处。\]结束非打印字符序列。<\u@\h \W>\$提示符字符串。