自定义Bash提示符并着色

系列 - Customize Prompt of Shell
原文地址

Control Sequence Introducer (CSI) 在ANSI转义序列中用两字符序列ESC [表示, 这个序列是由控制字符ESC (通常用^[<ESC>表示) , 加上左方括号字符[组成, 即^[[

在bash中, 控制字符ESC也支持\e\033\x1b三种转义字符的写法, 大写字母也行 (\E\x1B) 。

转义序列代码中没有空格
转义序列代码在实际使用时中间没有空格, 下面示例中用空格隔开只是方便阅读。

要控制显示格式, 须使用Set Graphic Rendition (SGR) 转义序列: ESC [ parameters m

  • parameters是控制代码, 使用多个代码时中间用分号;隔开, 比如1;31
  • 如果不指定控制代码, 即ESC [ m, 相当于ESC [ 0 m (重置所有显示控制属性为默认设置) 。
  • m表示SGR序列。

显示控制代码有3类:

  • 效果控制代码
  • 前景色控制代码 (即字体颜色)
  • 背景色控制代码
代码代码效果
000重置所有显示属性为默认设置
011字体加粗
044字体加下划线
055字体闪烁
077前景色与背景色调转

000效果相同, 其他数字也类似。

前景色代码背景色代码颜色
3040黑色
3141红色
3242绿色
3343黄色
3444蓝色
3545紫色
3646青色
3747白色

环境变量配置文件中添加:

1
export PS1='${debian_chroot:+($debian_chroot)}\[\e[1;37m\]\t \[\e[1;31m\]\u\[\e[1;37m\]@\[\e[1;31m\]\h \[\e[1;36m\]$PWD\[\e[1;31m\]\n\$\[\e[0m\]'

其他Linux发行版自行注意chroot的写法。如果觉得自己用不到chroot, 也可以这样:

1
export PS1='\[\e[1;37m\]\t \[\e[1;31m\]\u\[\e[1;37m\]@\[\e[1;31m\]\h \[\e[1;36m\]$PWD\[\e[1;31m\]\n\$\[\e[0m\]'
  • \[\]这两个转义字符通知bash, 被括起来的字符不占用命令行上的任何空间, 这样就使自动换行能够继续正常工作。如果没有这两个转义字符, 当用户键入的命令到达终端的最右端时, 或者查看历史命令时, 就会出现显示错乱的情况。
  • \e[1;37m即SGR转义序列ESC [ parameters m, 定义后续字符的颜色, 这里是加粗的白色。
  • \t以HH:MM:SS格式显示24小时制时间。
  • \u显示当前用户名。
  • \h显示当前host机器名称。
  • $PWD显示完整路径。
  • \n表示换行。
  • \$当用户为root时, 显示为#
  • \e[0m重置后续字符的显示控制属性为默认设置。

普通用户:

20:34:50 zhyoch@Debian /home/zhyoch
$

root用户:

20:34:50 root@Debian /root
#

修改C:\Program Files\Git\etc\profile.d\git-prompt.sh, 参考使用以下内容:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
if test -f /etc/profile.d/git-sdk.sh
then
	TITLEPREFIX=SDK-${MSYSTEM#MINGW}
else
	TITLEPREFIX=$MSYSTEM
fi

if test -f ~/.config/git/git-prompt.sh
then
	. ~/.config/git/git-prompt.sh
else
	PS1='\[\e]0;$TITLEPREFIX:$PWD\007\]' # set window title
	PS1="$PS1"'\n'                 	# new line
	PS1="$PS1"'\[\e[1;37m\]'       	# change to white
	PS1="$PS1"'\t '                 # show time
	PS1="$PS1"'\[\e[1;31m\]'       	# change to red
	PS1="$PS1"'\u'					# show user
	PS1="$PS1"'\[\e[1;37m\]'       	# change to white
	PS1="$PS1"'@'					# show @
	PS1="$PS1"'\[\e[1;31m\]'       	# change to red
	PS1="$PS1"'\h '             	# show host<space>
	PS1="$PS1"'\[\e[1;36m\]'       	# change to cyan
	PS1="$PS1"'$PWD'                # current working directory
	if test -z "$WINELOADERNOEXEC"
	then
		GIT_EXEC_PATH="$(git --exec-path 2>/dev/null)"
		COMPLETION_PATH="${GIT_EXEC_PATH%/libexec/git-core}"
		COMPLETION_PATH="${COMPLETION_PATH%/lib/git-core}"
		COMPLETION_PATH="$COMPLETION_PATH/share/git/completion"
		if test -f "$COMPLETION_PATH/git-prompt.sh"
		then
			. "$COMPLETION_PATH/git-completion.bash"
			. "$COMPLETION_PATH/git-prompt.sh"
			PS1="$PS1"'\[\e[1;36m\]'  # change color to cyan
			PS1="$PS1"'`__git_ps1`'   # bash function
		fi
	fi
	PS1="$PS1"'\n'                 # new line
	PS1="$PS1"'\[\e[1;31m\]'       # change to red
	PS1="$PS1"'$'                 # prompt: always $
	PS1="$PS1"'\[\e[0m\]'        # change color to unset
fi

MSYS2_PS1="$PS1"

# Evaluate all user-specific Bash completion scripts (if any)
if test -z "$WINELOADERNOEXEC"
then
	for c in "$HOME"/bash_completion.d/*.bash
	do
		# Handle absence of any scripts (or the folder) gracefully
		test ! -f "$c" ||
		. "$c"
	done
fi

要想效果和上面一样, 需要更改GitBash的设置: OptionsTextShow blodas font & as colour