自定义 prompt 样式
条评论自定义 Bash Prompt 时,作用域分为 仅当前用户 和全部用户
实现
仅当前用户有效
编辑~/.bashrc
,并在该行 # User specific aliases and functions 以下添加以下内容:
1 | export PS1="[\[\e[32m\]\t \u@\H \[\e[32;7m\]\W\[\e[m\]]\$" |
然后执行以下命令即可生效:
1 | source ~/.bashrc |
全部用户有效
编辑/etc/bashrc
,注释掉默认设置并添加以下内容:
1 | # ["$PS1" = "\\s-\\v\\\$"] && PS1="[\u@\h \w]\\$" |
然后执行以下命令即可生效:
1 | source /etc/bashrc |
原理和背景知识
文章一开头图片里那玩意儿英文定义叫 prompt,中文翻译是 提示符 ,或者具体点叫 终端提示符。
Bash 有四个可以定制的 prompt:
PS1
是在每个命令前都显示的主要 prompt,大部分用户都是定制这个值。PS2
命令需要输入时的第二 prompt(比如多行命令).PS3
不常用,Bash 的内置select
显示交互菜单时使用. 和其它 prompt 不一样,它不扩展 Bash escape sequences. 通常在使用包含select
的脚本时会需要定制此 prompt。PS4
也不常用,在调试bash
脚本时显示缩进级别。第一个字符的重复次数表示缩进级别。
所有 prompt 都可以通过设置变量到需要的数值进行定义(通常在 ~/.bashrc
), 例如:
1 | export PS2='>' |
但常用的就只有 PS1
,这里也只谈 PS1
。
查看环境变量 PS1
默认值的命令:
1 | echo $PS1 |
语法
双引号之间的便是 prompt 的语法控制了,其又分为多个部分,已用不同颜色标注,这里挨个儿来讲:
标黄部分
颜色 / 效果控制代码,语法为:
1 | \e[{F}{(;)B}m |
\e
固定写法,e 不区分大小写。
{F}
表前景色(取值范围参考文末附录,下同),即字体颜色;({;B})
表后景色或后景效果,后景色即通常所说的背景色。圆括号表选填,不填后景色时默认后景颜色为无色、后景效果为 OFF,也就是没效果。前后景色书写顺序不区分先后,以分号隔开即可。
m
固定写法。
具体解释:
第 1 段 \e[32m
表示字体颜色为绿色,作用域起始于该段代码之后,结束于下一段同类代码之前。
第 2 段 \e[32;7m
表示字体颜色为绿色,后景效果为 反白显示。作用域起始于该段代码之后,结束于下一段同类代码之前。
注意:关于作用域,如果这里第 1 段和第 2 段反过来,即新第 1 段为 \e[32;7m
,新第 2 段为 \e[32m
的话,新第 2 段的 32
只会结束新第 1 段的 7
,但不会结束新第 1 段的 32
,即 前后景色的作用域控制是各自独立的,需要分别控制。
第 3 段 \e[m
是颜色 / 效果控制代码结束符。注意如果没这个的话,输入的命令也会被第 2 段的颜色 / 效果控制代码作用。
红字蓝字部分
Shell 转义字符序列,具体解释如下:
\[
标志着一个或多个非打印字符的开始。这被用来嵌入非打印的控制字符,这些字符以某种方式来操作终端仿真器,比方说移动光标或者是更改文本颜色\]
标志着非打印字符序列结束\t
表示 24 小时格式的时间,如:HH:MM:SS\u
表示当前用户的账号名称\H
表示完整的主机名称,如:ubuntu.ubuntu.com\W
表示当前工作目录名\$
root 用户时显示一个$
字符,普通用户时显示为一个#
字符
更多 Shell 转义字符序列参考下文附录
其它部分
剩下的都好说,全部 原样输出,比如中括号、at 符、空格
附录
- 前后景色 颜色控制代码 取值范围(注意同一颜色在前后景色中的代码不同)
前景 | 后景 | 颜色 |
---|---|---|
30 | 40 | 黑色 |
31 | 41 | 红色 |
32 | 42 | 绿色 |
33 | 43 | 黄色 |
34 | 44 | 蓝色 |
35 | 45 | 紫红色 |
36 | 46 | 青蓝色 |
37 | 47 | 白色 |
- 后景色 效果控制代码 取值范围
代码 | 意义 |
---|---|
0 | OFF |
1 | 高亮显示 |
4 | underline |
5 | 闪烁 |
7 | 反白显示 |
8 | 不可见 |
- Shell 转义字符序列
字符 | 意义 |
---|---|
\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 格式来表示当前时间,例如“10:51 PM”; |
\A | 以 24 小时制,hours:minutes 格式表示当前时间; |
\u | 当前用户名; |
\v | shell 程序的版本号,例如 4.3; |
\V | shell 程序的版本号,例如 4.3.11; |
\w | 当前工作目录名; |
\W | 当前工作目录名的最后部分; |
\! | 当前命令的历史号; |
\# | 当前 shell 会话中的命令数; |
\$ | 这会显示一个”$”字符,除非你拥有超级用户权限。在那种情况下, 它会显示一个”#”字符; |
\[ | 标志着一系列一个或多个非打印字符的开始。这被用来嵌入非打印的控制字符,这些字符以某种方式来操作终端仿真器,比方说移动光标或者是更改文本颜色; |
\] | 标志着非打印字符序列结束; |