首页
服务端开发/管理

分类

当前位置: 云海天教程网 > 技术新闻 > 服务端开发/管理 >正文

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

更新时间:2023-02-05  作者:佚名   来源: 网络转载

Git for Windows 的 Bash 有一个很实用的功能,如果当前目录处于 Git 仓库中,那么命令行中会显示当前 Git 分支的名称(见下图)。

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

然而原版的 MSYS2 Bash 没有这个功能(见下图),不过我们可以自己动手配置出相同的效果。

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

配置方法

打开 MSYS2 的家目录,找到 .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;wa]
[e[32m]u@h [e[35m]$MSYSTEM [e[33m]w[e[36m]$(parse-git-branch)12[e[0m]$(prompt-sign) "

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

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

原理

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

  • u:用户名
  • h:主机名
  • w:当前目录
  • :换行
  • $:对 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) 语法。

到了这里你会碰到 MSYS2 的一个 BUG,在 $(parse-git-branch) 之后使用 换行会报如下的错误:

bash: unexpected EOF while looking for matching `)"

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

接下来你会碰到 MSYS2 的另一个 BUG。正常来说,当以管理员身份运行 MSYS2 Bash 时会显示一个 #(见下图),当以普通用户身份运行时则显示一个 $,这与 Linux Bash 面对 root 用户/普通用户的行为十分相似。

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

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

上一篇:C++深浅拷贝及简易string类实现方式【C++教程】 下一篇:CLion 2023 破解[最新免费获取]
小编推荐
快速导航更多>>
JavaScript 教程 HTML5 教程 CSS3 教程 jQuery 教程 Vue.js 教程 Node.js 教程 SQL 教程 C 教程 PHP 教程 Linux 教程 Docker 教程 Nginx 教程 Python 教程 Java 教程

云海天教程网 版权所有

 陕公网安备 61050202000585号

陕ICP备14013131号-3