使用远程终端时,默认的命令行提示符格式已经能满足大部分用户需求了,但有时我们希望提示符看起来更直观、优雅、酷炫、美观,可以从中直接得到我们想要的信息,而且清晰分明。本文就详细讲解一下如何让 Shell 提示符更酷炫,一起来学习一下吧!
效果
闲话少说,先上效果!
export PS1="[\e[35m\u@\e[32m\h \e[33m\W\e[0m]$ "
echo
export PS1="[\e[1;4;37;42m\u@\e[31m\h\e[0m \e[5;33;47m\W\e[0m]$ "
echo
export PS1="[\e[1;4;37;42m\u@\e[7;31m\h\e[0m \e[5;33;47m\W\e[0m]$ "
echo
export PS1="[\e[1;3;4;5;37m\u@\h\e[0m \W\e[0m]$ "
echo
export PS1="[\e[1;21;37m\u@\h\e[0m \W\e[0m]$ "
echo
Shell 酷炫提示符动态效果1
[root@natnet-source ~]$ cat test_csi.sh
#!/bin/bash
test_echo() {
echo -e "$1"
echo
}
# test CSI 1..9
for i in `seq 1 9`;
do
echo "CSI $i"
test_echo "[\e[$i;32m${USER}@${HOSTNAME} ${PWD}]\\\$ "
done
# test combination
test_echo "[\e[35m${USER}@\e[32m\${HOSTNAME} \e[33m${PWD}\e[0m]\$ "
test_echo "[\e[1;4;37;42m${USER}@\e[31m${HOSTNAME}\e[0m \e[5;33;47m${PWD}\e[0m]\\$ "
test_echo "[\e[1;4;37;42m${USER}@\e[7;31m${HOSTNAME}\e[0m \e[5;33;47m${PWD}\e[0m]\\$ "
test_echo "[\e[1;3;4;5;37m${USER}@${HOSTNAME}\e[0m ${PWD}\e[0m]\\$ "
test_echo "[\e[1;21;37m${USER}@${HOSTNAME}\e[0m ${PWD}\e[0m]\\$ "
Shell 酷炫提示符动态效果2
注意
测试 Shell 提示符显示效果时建议使用echo
命令。
使用export PS1=
直接修改PS1
时,与history
功能使用 方向键上、下 查看历史命令配合使用有 Bug (也有可能时学艺不精,没空深挖终端的控制序列,且因过时了意义不大),在遇到形如export PS1=
的历史命令时会残留这部分字符串,具体如下所示:
知识
这种操作大类上属于 终端控制 ,修改 Shell 提示符字体和颜色的功能属于控制序列引入的一种功能。我参考了 XTerm Control Sequences 。因在如今详细学习它意义不大,所以笔者这里仅挑选与本文主旨相关的重要的讲解。
控制(Controls) 的参数:
- C :单个(必须的)字符。
- Ps :一个(通常是可选的)数字参数,由一个或多个数字组成。
- Pm :任意数量的单个数字参数 Ps ,以
;
字符分隔。 - Pt :由可打印字符组成的文本参数。
名词解释
-
ECMA-48(又名 “ISO 6429”)
- 记录了 C0(7位) 和 C1(8位) 代码。 C0
- 代码 0 至 31 。 C1
- 代码 128 至 159 。 ESC (Escape)
- 跳脱字符,又叫转义字符。ASCII 码十进制为 27 ,八进制为 \033 ,十六进制为 \0x1b ,某些时候也可以使用 \e 表示。 CSI (Control Sequence Introducer)
-
即
ESC [
(CSI 是 0x9b) ,如上所述,其变种形式为\e[
,\033[
。
CSI
Pm m Character Attributes (SGR)
-
Ps = 0 ⇒ Normal (default), VT100. Ps = 1 ⇒ Bold, VT100. Ps = 2 ⇒ Faint, decreased intensity, ECMA-48 2nd. Ps = 3 ⇒ Italicized, ECMA-48 2nd. Ps = 4 ⇒ Underlined, VT100. Ps = 5 ⇒ Blink, VT100. This appears as Bold in X11R6 xterm. Ps = 7 ⇒ Inverse, VT100. Ps = 8 ⇒ Invisible, i.e., hidden, ECMA-48 2nd, VT300. Ps = 9 ⇒ Crossed-out characters, ECMA-48 3rd. Ps = 2 1 ⇒ Doubly-underlined, ECMA-48 3rd. Ps = 2 2 ⇒ Normal (neither bold nor faint), ECMA-48 3rd. Ps = 2 3 ⇒ Not italicized, ECMA-48 3rd. Ps = 2 4 ⇒ Not underlined, ECMA-48 3rd. Ps = 2 5 ⇒ Steady (not blinking), ECMA-48 3rd. Ps = 2 7 ⇒ Positive (not inverse), ECMA-48 3rd. Ps = 2 8 ⇒ Visible, i.e., not hidden, ECMA-48 3rd, VT300. Ps = 2 9 ⇒ Not crossed-out, ECMA-48 3rd. Ps = 3 0 ⇒ Set foreground color to Black. Ps = 3 1 ⇒ Set foreground color to Red. Ps = 3 2 ⇒ Set foreground color to Green. Ps = 3 3 ⇒ Set foreground color to Yellow. Ps = 3 4 ⇒ Set foreground color to Blue. Ps = 3 5 ⇒ Set foreground color to Magenta. Ps = 3 6 ⇒ Set foreground color to Cyan. Ps = 3 7 ⇒ Set foreground color to White. Ps = 3 9 ⇒ Set foreground color to default, ECMA-48 3rd. Ps = 4 0 ⇒ Set background color to Black. Ps = 4 1 ⇒ Set background color to Red. Ps = 4 2 ⇒ Set background color to Green. Ps = 4 3 ⇒ Set background color to Yellow. Ps = 4 4 ⇒ Set background color to Blue. Ps = 4 5 ⇒ Set background color to Magenta. Ps = 4 6 ⇒ Set background color to Cyan. Ps = 4 7 ⇒ Set background color to White. Ps = 4 9 ⇒ Set background color to default, ECMA-48 3rd.
修改字体
Ps | 描述 | 适用终端及标准 |
---|---|---|
0 | 正常(默认) | VT100 |
1 | 粗体 | VT100 |
2 | 灰暗字体 | ECMA-48 第二版 |
3 | 斜体 | ECMA-48 第二版 |
4 | 下划线 | VT100 |
5 | 闪烁 | VT100(在 X11R6 xterm 显示为粗体) |
7 | 反转(高亮) | VT100 |
8 | 不可见,例如,隐藏 | ECMA-48 第二版,VT300 |
9 | 删除线 | ECMA-48 第三版 |
注意
“适用终端及标准”为空,表示默认支持大部分终端,例如 Xterm 、VT100 ~ VT500 等。
[root@natnet-source ~]$ cat test_font.sh
#!/bin/bash
test_echo() {
echo -e "$1"
echo
}
for i in `seq 1 9`;
do
test_echo "\e[${i}mPs=$i\e[0m"
done
Shell 酷炫提示符动态效果-测试字体
修改字体颜色
Ps | 类型 | 颜色 | 适用终端及标准 |
---|---|---|---|
30 | 前景色 | 黑 | |
31 | 前景色 | 红 | |
32 | 前景色 | 绿 | |
33 | 前景色 | 黄 | |
34 | 前景色 | 蓝 | |
35 | 前景色 | 紫 | |
36 | 前景色 | 青 | |
37 | 前景色 | 白 | |
39 | 前景色 | 默认 | ECMA-48 第三版 |
40 | 背景色 | 黑 | |
41 | 背景色 | 红 | |
42 | 背景色 | 绿 | |
43 | 背景色 | 黄 | |
44 | 背景色 | 蓝 | |
45 | 背景色 | 紫 | |
46 | 背景色 | 青 | |
47 | 背景色 | 白 | |
49 | 背景色 | 默认 | ECMA-48 第三版 |
注意
“适用终端及标准”为空表示默认支持大部分终端,例如 Xterm 、VT100 ~ VT500 等。
[root@natnet-source ~]$ cat test_color.sh
#!/bin/bash
test_echo() {
echo -e "$1"
echo
}
for i in `seq 30 49`;
do
if [[ $i != 38 && $i != 48 ]];then
test_echo "\e[${i}mPs=$i\e[0m"
fi
done
组合使用字体
[root@natnet-source ~]$ cat test_combine_font.sh
#!/bin/bash
test_echo() {
echo -e "$1"
echo
}
for i in `seq 1 9`;
do
if [[ $i -gt 1 ]];then
cs=${cs}\;$i
else cs=$i
fi
test_echo "\e[${cs}mPs=${cs}\e[0m"
done
Shell酷炫提示符动态效果-字体组合
组合使用颜色
这里指的是组合使用前景色和背景色,无法组合使用同一种类型的颜色,最后一个 Ps 指定的颜色生效,覆盖之前的。例如:
echo -e "\e[30;31;32m What will happen ?"
组合使用前景色和背景色的效果如下:
当前景色为白色时,设置背景色为绿色;除此之外,背景色都为白色。
[root@natnet-source ~]$ cat test_combine_color.sh
#!/bin/bash
test_echo() {
echo -e "$1"
echo
}
for i in `seq 30 39`;
do
if [[ $i != 37 ]];then
cs=${i}\;47
else cs=${i}\;42
fi
test_echo "\e[${cs}mPs=${cs}\e[0m"
done
组合使用字体和颜色
此脚本使用默认背景色,变换前景色,与变换字体的组合。
[root@natnet-source ~]$ cat test_combine_all.sh
#!/bin/bash
test_echo() {
echo -e "$1"
echo
}
for i in `seq 1 9`;
do
if [[ $i -gt 1 ]];then
if [[ $i != 9 ]];then
cs=${cs}\;${i}\;$((i+29))
else cs=${cs}\;${i}\;37
fi
else cs=$i
fi
test_echo "\e[${cs}mPs=$cs\e[0m"
done
Shell 酷炫提示符动态效果-字体颜色组合
不同终端工具显示的效果可能有差异
分别在两个终端工具内执行如下命令:
echo -e "\e[9m删除线"
echo -e "\e[9m删除线\e[0m"
WindTerm
SecureCRT
PS1 配置说明
在交互执行时, bash 在准备好读入一条命令时显示主提示符 PS1, 在需要更多的输入来完成一条命令时显示 PS2。 Bash 允许通过插入一些反斜杠转义的特殊字符来定制这些提示字符串,这些字符被如下解释:
特殊字符 | 描述 |
---|---|
\a | 一个 ASCII 响铃字符 (07) |
\d | 日期,格式是 “星期 月份 日” (例如,“Tue May 26”) |
\D{format} | format 被传递给 strftime(3),结果被插入到提示字符串中; 空的 format 将使用语言环境特定的时间格式。花括号是必需的 |
\e | 一个 ASCII 转义字符 (033) |
\h | 主机名,第一个 `.’ 之前的部分 |
\H | 主机名 |
\j | shell 当前管理的作业数量 |
\l | shell 的终端设备名的基本部分 |
\n | 新行符 |
\r | 回车 |
\s | shell 的名称, $0 的基本部分 (最后一个斜杠后面的部分) |
\t | 当前时间,采用 24小时制的 HH:MM:SS 格式 |
\T | 当前时间,采用 12小时制的 HH:MM:SS 格式 |
@ | 当前时间,采用 12小时制上午/下午 (am/pm) 格式 |
\A | 当前时间,采用 24小时制上午/下午格式 |
\u | 当前用户的用户名 the username of the current user |
\v | bash 的版本 (例如,2.00) |
\V | bash 的发行编号,版本号加补丁级别 (例如,2.00.0) |
\w | 当前工作目录 |
\W | 当前工作目录的基本部分 |
! | 此命令的历史编号 |
# | 此命令的命令编号 |
$ | 如果有效 UID 是 0,就是 #, 其他情况下是 $ |
\nnn | 对应八进制数 nnn 的字符 |
\ | 一个反斜杠 |
[ | 一个不可打印字符序列的开始,可以用于在提示符中嵌入终端控制序列 |
] | 一个不可打印字符序列的结束 |
临时生效
如果想要临时修改 Shell 提示符样式,请使用 export PS1=
命令,执行后会即时生效,在关闭本次会话后失效。
永久生效
如果想要永久修改 Shell 提示符样式,则:
- 要使影响范围为全局所有用户,建议在
/etc/profile.d/
目录下新建.sh
后缀的 Shell 脚本,写入export PS1=
命令。[root@natnet-source ~]$ cat /etc/profile.d/interactive_shell.sh shopt -s cdable_vars cdspell direxpand dirspell autocd export PS1="[\e[1;35;42m\u\e[34m@\e[37m\h\e[0m \e[33;47m\W\e[0m]$ "
- 要使影响范围为单一用户,建议在
~/.bash_profile
中写入export PS1=
命令。
注意事项
原始 PS1
的配置为 PS1="[\u@\h \W]\\$ "
,这里\\$
是提示符中的特殊字符,登录用户为 root
时为 #
;否则为 $
或 \$
。
因为我们已经定义了更华丽、酷炫的提示符,因而再使用这个特殊字符意义不大,而且在向 Markdown 笔记的代码块中复制命令时显示效果不佳,显示为注释样式。所以我在使用自定义提示符时,将 \\$
改为 \$
,即所有用户的提示符除空格外最后一个字符为$
。
man bash
#在 man 里面查找 “^PROMPTING”
/^PROMPTING
可使用如下命令安装 man-pages 的中文版
yum install man-pages-zh-CN.noarch
安装完后可以使用-L 区域
选项选择查看哪个版本的 man-pages 。例如,在安装了 man-pages 中文版后,默认打开的是它;如需查看英文版的,则执行:
man -L en bash
man -L zh_CN bash
区域 的取值可以参考/usr/share/man/
下面的目录名称。