1. PS1示例
先说一下bash版本
1$ bash --version
2GNU bash, version 5.1.4(1)-release (x86_64-pc-linux-gnu)
3Copyright (C) 2020 Free Software Foundation, Inc.
4License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
5
6This is free software; you are free to change and redistribute it.
7There is NO WARRANTY, to the extent permitted by law.
bash中的PS1是主提示符变量,也是默认提示符变量。另外需要注意,PS1
对bash起作用,对sh是无效的。可以通过echo $SHELL
确认当前用户使用的shell是否为bash。除了PS1外,还有PS2、PS3、PS4几个环境变量用来提示一些其他信息。
下面看几个示例
1export PS1='\e[1;32m\][\e[1m\]\e[3;35m\]\u\e[0;34m\]@\e[1;33m\]\H\e[1;32m\]][\e[1;34m\]\t\e[1;32m\]] \e[1m\]\e[3;30m\]\w\e[0m\]\n\$ '
上边示例的闪烁版本,用户名和主机会闪烁显示
1export PS1='\e[1;32m\][\e[1m\]\e[5m\]\e[3;35m\]\u\e[0m\]\e[5;34m\]@\e[1;33m\]\H\e[0m\]\e[1;32m\]][\e[1;34m\]\t\e[1;32m\]] \e[1;30m\]\e[3;30m\]\w\e[0m\]\n\$ '
参考最好看的Bash美化——打造ParrotOS风格的Bash改的版本
1export PS1='\e[0;31m\]\342\224\214\342\224\200\e[1;32m\][\e[1m\]\e[3;35m\]\u\e[0m\]@\e[1;33m\]\H\e[1;32m\]][\e[1;34m\]\t\e[1;32m\]] \e[1;30m\]\e[3;30m\]$PWD\e[0m\]\n\e[0;31m\]\342\224\224\342\224\200\342\224\200\342\225\274 \e[0m\]\$ '
2. 颜色设置
2.1. 颜色设置格式
1\e[A;F;Bm文本
2\e[A;F;Bm\]文本
3\[\e[A;F;Bm\]文本
\e[A;F;Bm
控制文本格式,\[
和\]
分别表示不可见字符的起始和结束,所以三种格式效果是一样的。个人比较喜欢用\e[A;F;Bm\]
。
需要注意的是,格式设置后,会对后边所有文本起作用,包括我们在终端输入的命令。而且A/F/B是分别起作用的,只要不被重置,效果会一直延续,后边会详细解释。
如果想取消文本效果,可以在文本前添加如下格式。当然下边格式之后也可以加文本,只是文本显示为默认样式。
1\e[0m
2\e[0m\]
3\[\e[0m\]
2.2. 颜色格式说明
这里说一下,格式中A/F/B的位置是任意的,bash是依靠值来对格式进行解析。也就是说\e[A;F;Bm\]
、\e[F;B;Am\]
、\e[F;B;Am\]
等效果都是一样的。而且因为A/F/B的位置是任意的,为了书写简便,就可以省略A/F/B中的1个或2个参数。
下面对格式进行详细说明
\e
表示Esc
,也可以替换为\033
A表示字体样式,其中数字可以使用多位数,如03
与3
效果相同
10 OFF,默认样式
21 高亮加粗显示
32 变暗
43 斜体
54 显示下划线
65 闪烁显示
77 反色显示
88 颜色不可见
F表示字体颜色,B表示背景颜色
1F B 颜色
230 40 黑色
331 41 红色
432 42 绿色
533 43 黄色
634 44 蓝色
735 45 紫红色
836 46 青蓝色
937 47 白色
2.3. 格式组合
字体样式A只能控制一种格式,如果想要加粗斜体、红字黄底该怎么办呢?
1\e[1;31;43m\]\e[3m\]文本
2\e[3;31;43m\]\e[1m\]文本
3\e[1;31m\]\e[3;43m\]文本
下面来详细分解下,关于\u
、\H
等变量的说明见后边bash提示符中的变量
1export PS1='\e[1;32m\][\e[1m\]\e[3;35m\]\u\e[0;34m\]@\e[1;33m\]\H\e[1;32m\]][\e[1;34m\]\t\e[1;32m\]] \e[1m\]\e[3;30m\]\w\e[0m\]\n\$ '
1\e[1;32m\][ 加粗绿色显示[
2\e[1m\]\e[3;35m\]\u 加粗斜体紫红色显示用户名
3\e[0;34m\]@ 默认样式蓝色显示@
4\e[1;33m\]\H 加粗黄色显示主机名
5\e[1;32m\]][ 加粗绿色显示][
6\e[1;34m\]\t 加粗蓝色显示时间
7\e[1;32m\]] 加粗绿色显示]和空格
8\e[1m\]\e[3;30m\]\w 加粗斜体黑色显示工作路径
9\e[0m\]\n\$ 清除所有格式,换行显示提示符,注意提示符后有空格
前边提到A/F/B起作用,以上边用户名显示举例来说
如果把\e[3;35m\]\u
中的紫色显示去掉,用户名会继续显示绿色。
1\e[1;32m\][\e[1;32m\][\e[1m\]\e[3;35m\]\u
2# 去掉紫色部分
3\e[1;32m\][\e[1;32m\][\e[1m\]\e[3m\]\u
3. bash提示符中的变量
官方链接:Controlling the Prompt (Bash Reference Manual)
1\a ASCII响铃字符(07)
2\d 日期,格式为"周 月 日"
3\D{format} 参数format被传递给strftime(3)来构造自定格式的时间并入提示符中;
4 该参数为空时根据本地化设置自动生成格式。
5\e ASCII转义字符(ESC)同\033
6\h 简略主机名,在第一个点号前的内容
7\H 完整主机名
8\j shell当前管理的任务数
9\l shell终端设备的基本名称
10\n 换行
11\r 回车,到当前行的起始位置
12\s shell的名称,$0的基本名称(最后一个斜杠后面的部分)
13\t 当前时间(24小时) HH:MM:SS
14\T 当前时间(12小时) HH:MM:SS
15\@ 当前时间(12小时) am/pm
16\A 当前时间(24小时) HH:MM
17\u 当前用户名称
18\v bash版本(如"2.00")
19\V bash版本+补丁号(如"2.00.0")
20\w 当前工作目录,主目录会显示为~
21\W 当前工作目录的基本名称,只会列出最后一个目录,主目录会显示为~
22\! 该命令在历史文件中的位置
23\# 该命令在当前shell中执行的序列位置
24\$ 提示符,root用户为#,普通用户为$
25\nnn 八进制数ASCII,用于显示一些特殊字符
26\\ 反斜杠
27\[ 非打印字符起始,可以用来将终端控制序列嵌入到提示符中
28\] 非打印字符起始结束
3.1. 其他扩展
除了bash提供的变量之外,还可以使用其他的环境变量,如PWD等,也可以使用一些命令表达式。
比如可以把\w
换乘${PWD}
或$(pwd -P)
。
再比如添加$([[ $? != 0 ]] && echo -ne "\e[31mFAIL\e[0m" || echo -ne "\e[34mOK\e[0m")
,显示上一条命令的执行结果
1export PS1='\e[1;32m\][\e[1m\]\e[3;35m\]\u\e[0;34m\]@\e[1;33m\]\H\e[1;32m\]][\e[1;34m\]\t\e[1;32m\]][$([[ $? != 0 ]] && echo -ne "\e[31mFAIL\e[0m" || echo -ne "\e[34mOK\e[0m")\e[1;32m\]] \e[1m\]\e[3;30m\]\w\e[0m\]\n\$ '