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表示字体样式,其中数字可以使用多位数,如033效果相同

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\$ '

4. 参考

最好看的Bash美化——打造ParrotOS风格的Bash

Controlling the Prompt (Bash Reference Manual)