目录

自定义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白色

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

bash

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

普通用户:


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

root用户:


20:34:50 root@Debian /root
#

对于Git for Windows Setup, 修改C:\Program Files\Git\etc\profile.d\git-prompt.sh; 对于Git for Windows Portable, 修改PortableGit\etc\profile.d\git-prompt.sh, 参考使用以下内容:

bash

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+='\n'
    PS1+='\[\e[1;37m\]'
    PS1+='\t '
    PS1+='\[\e[1;31m\]'
    PS1+='\u'
    PS1+='\[\e[1;37m\]'
    PS1+='@'
    PS1+='\[\e[1;31m\]'
    PS1+='\h '
    PS1+='\[\e[1;36m\]'
    PS1+='$PWD'
    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+='\[\e[1;36m\]' # change color to cyan
            PS1+='`__git_ps1`'  # bash function
        fi
    fi
    PS1+='\n'
    PS1+='\[\e[1;31m\]'
    PS1+='$ '
    PS1+='\[\e[0m\]'
fi

MSYS2_PS1="$PS1" # for detection by MSYS2 SDK's bash.basrc

# 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