让 MSYS2 Bash 像 Git Bash 一样显示 Git 分支名称

科技资讯 投稿 5700 0 评论

让 MSYS2 Bash 像 Git Bash 一样显示 Git 分支名称

配置方法

.bashrc 文件,在其中插入以下代码:

function parse-git-branch( {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\/ (\1/'
}

function prompt-sign( {
    net session > /dev/null 2>&1
    if [ $? -eq 0 ]; then
        echo "#"  # administrator
    else
        echo "$"  # common user
    fi
}

export PS1="\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[35m\]$MSYSTEM \[\e[33m\]\w\[\e[36m\]\$(parse-git-branch\012\[\e[0m\]$(prompt-sign "

接着,关闭并重新打开命令行窗口,或者在命令行中执行 source ~/.bashrc 命令,即可看到更改后的效果(见下图)。

原理

PS1 这个 shell 环境变量来配置命令提示符,PS 是 prompt string 的缩写。MSYS2 的 PS1 的默认值是 \[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[35m\]$MSYSTEM\[\e[0m\] \[\e[33m\]\w\[\e[0m\]\n\$ 。在 PS1 中,以反斜杠开头的字符有特殊含义,例如:

    \u:用户名
  • \h:主机名
  • \w:当前目录
  • \n:换行
  • \$:对 root 用户显示 #,对普通用户显示 $

Controlling the Prompt (Bash Reference Manual。

PS1 支持用 ANSI 转义序列(ANSI escape code)配置文本的颜色,详见 ANSI escape code - Wikipedia

PS1 的相关规则后,自定义命令提示符就不是一件难事了。写一个获取 Git 分支名称的函数 parse-git-branch,然后用 \$(parse-git-branch 将分支名称插入 PS1 中即可。请注意双引号字符串中 $(expr\$(expr 的区别,如果用的是 $(expr 语法,则只会在第一次读取变量时对 expr 求值一次,如果用的是 \$(expr 语法,则每次读取变量时都会对 expr 求值。由于我们希望每次更改目录后都重新读取 Git 分支的名称,因此应使用 \$(expr 语法。

\$(parse-git-branch 之后使用 \n 换行会报如下的错误:

bash: unexpected EOF while looking for matching `'

这个 Stack Overflow 回答给了一种变通的办法,使用 \012(换行符的 ASCII 码)来代替 \n 即可。

#(见下图),当以普通用户身份运行时则显示一个 $,这与 Linux Bash 面对 root 用户/普通用户的行为十分相似。

PS1 中使用 \$ 为 root 用户和普通用户显示不同的提示符号。但是不知何故 MSYS2 不支持这个功能,始终显示的是 $,所以需要额外写一个函数判断当前是否为管理员身份(即上面的 prompt-sign 函数),我用的是这个回答中的方法。

编程笔记 » 让 MSYS2 Bash 像 Git Bash 一样显示 Git 分支名称

赞同 (28) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽