让 MSYS2 Bash 像 Git Bash 一样显示 Git 分支名称
Git for Windows 的 Bash 有一个很实用的功能,如果当前目录处于 Git 仓库中,那么命令行中会显示当前 Git 分支的名称(见下图)。
然而原版的 MSYS2 Bash 没有这个功能(见下图),不过我们可以自己动手配置出相同的效果。
配置方法
打开 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;\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)
语法。
到了这里你会碰到 MSYS2 的一个 BUG,在 \$(parse-git-branch)
之后使用 \n
换行会报如下的错误:
bash: unexpected EOF while looking for matching `)'
这个 Stack Overflow 回答给了一种变通的办法,使用 \012
(换行符的 ASCII 码)来代替 \n
即可。
接下来你会碰到 MSYS2 的另一个 BUG。正常来说,当以管理员身份运行 MSYS2 Bash 时会显示一个 #
(见下图),当以普通用户身份运行时则显示一个 $
,这与 Linux Bash 面对 root 用户/普通用户的行为十分相似。
前文提到,可以在 PS1
中使用 \$
为 root 用户和普通用户显示不同的提示符号。但是不知何故 MSYS2 不支持这个功能,始终显示的是 $
,所以需要额外写一个函数判断当前是否为管理员身份(即上面的 prompt-sign
函数),我用的是这个回答中的方法。
最新文章
- Linux系统重启python程序
- 第一章 tomcat安装与启动
- Linux 技巧:让进程在后台可靠运行的几种方法(转)
- 自己遇到的Android虚拟机出现的错误及解决方法【不断更新】
- iOS开发——百度地图SDK集成
- bzoj3864: Hero meet devil
- Thread 线程简单例子
- crmsql句子的实体关系实体字段的信息窗口
- 剑指offer-链表中环的入口节点
- textCNN原理
- 在SOUI中使用布局模板
- AndroidStudio运行java的main方法
- 已经在Git Server服务器上导入了SSH公钥,可用TortoiseGit同步代码时,还是提示输入密码?
- 洛谷 P1338 末日的传说
- 第一篇:SpringBoot2.0简单介绍
- 浅析notifyDataSetChanged内部工作流程
- linux的IPC进程通信方式-匿名管道(一)
- PostgreSQL控制台以竖行显示
- Centos 7安装Grafana 4及结合Zabbix3.2实现可视化监控图形
- 为eclipse配置javap命令