如何在终端实时的展示当前所处的git分支?这里主要是在linux的shell中的PS1, PS2,PS3, PS4这些环境变量中动手脚达到这个目的,现在记录一下操作过程备忘。
实际效果如下图:
先来说说linux shell中的PS1,PS2,PS3,PS4 这几个环境变量。
PS1表示的默认交互提示,在ubuntu-12.04中的默认值是
"\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$"
也就是我们通常可以看到的:
yhm@yhm-pc:~/php.hhsy.cc$
在PS1中
\u -- 表示用户名
\h -- 表示主机名
\w -- 当前目录的全局路径,如果是home目录,显示~
\s -- 表示的bash
\v -- 表示版本
所以你可以修改默认的提示符:
export PS1="\u@\h-\v \w> "
按照上面的提示,显示的就是
yhm@yhm-pc-4.2 ~/php.hhsy.cc
通常情况下,我们只会用到PS1,但是当我们需要继续交互的时候,就会用到PS2,比方说输入命令行使用\来进行下一行处理。例如简单一些:
ls \
则会出现下面的提示符号,也就是PS2的内容
>
通常我们会用到的就这两个。
shell在执行PS1前,会先执行 PROMPT_COMMAND 这个指令,并且显示在PS1之前。所以我们可以在终端的 PROMPT_COMMAND 上做一些操作以达到我们本文的目的,实时显示当前所处的git分支。
我们先试验一下,修改 PROMPT_COMMAND 为下面的值:
export PROMPT_COMMAND="echo -n [$(date +%H:%M:%S)]"
那么提示符号将显示为:
[21:40:17]yhm@yhm-pc:~/php.hhsy.cc$
注意时间是定格的
可以使用unset方法来取消 PROMPT_COMMAND
git基础:
git是存在分支的,当前所在的git分支可以通过git branch来察看。
另外一种方式,获取.git/HEAD文件中的内容,格式是:
ref: refs/heads/当前分支名称
于是实现在终端实时展现git分支就有两种方案:
一、用下面指令替换PS1
git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
但是存在问题,那就是每次shell活动,都要启动一个git和sed的进程,开销会有些大。
二、先定义一个git分支的查询方式(此方法可以放在改文件的任意位置)
function find_git_branch { local dir=. head until [ "$dir" -ef / ]; do if [ -f "$dir/.git/HEAD" ]; then head=$(< "$dir/.git/HEAD") if [[ $head == ref:\ refs/heads/* ]]; then git_branch="<${head#*/*/}>" elif [[ $head != '' ]]; then git_branch=' (detached)' else git_branch=' (unknown)' fi return fi dir="../$dir" done git_branch='' }
然后用下面的方法替换:
PROMPT_COMMAND="find_git_branch; $PROMPT_COMMAND"
当然最后我们可以用下面的方式替换PS1
green=$'\e[1;32m'#绿色
magenta=$'\e[1;35m'#紫色
normal_colours=$'\e[m'
PS1="\[$green\]\u@\h:\w\[$magenta\]$git_branch\[$green\]\\$\[$normal_colours\] "
这样就可以在PS1中的颜色知道当前的状态。
关于上面的颜色代码可参考:PHP在终端输出带颜色的字体
备注:以上修改都是在 ~/.bashrc 文件中进行的操作。