在微博上看到ghosTM55在终端可以实时展现出当前运行的分支,觉得很奇特,于是google了一把。这里面存在两个内容,第一个bash,第二个是git
bash基础:
了解到linux的shell存在PS1, PS2,PS3, PS4,这些都作为环境变量存在。
PS1表示的默认交互提示,在ubuntu-12.04中的默认值是 "\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$",也就是我们通常可以看到的:
damon@damon:~/pyenv/bin$
在PS1中
\u -- 表示用户名
\h -- 表示主机名
\w -- 当前目录的全局路径,如果是home目录,显示~
\s -- 表示的bash
\v -- 表示版本
所以你可以修改默认的提示符:
export PS1="\u@\h-\v \w> "
按照上面的提示,显示的就是
damon@damon-4.2 ~/pyenv/bin
通常情况下,我们只会用到PS1,但是当我们需要继续交互的时候,就会用到PS2,比方说输入命令行使用\来进行下一行处理。例如简单一些:
ls \
则会出现下面的提示符号,也就是PS2的内容
>
通常我们会用到的就这两个
shell在执行PS1前,会先执行PROMPT_COMMAND这个指令,并且显示在PS1之前。所以我们可以在终端的PROMPT_COMMAND上做一些操作
然后得到显示一些特殊的内容,也就是ghosTM55上实时显示git分支。
我们先试验一下,修改PROMPT_COMMAND为下面的值:
export PROMPT_COMMAND="echo -n [$(date +%H:%M:%S)]"
那么提示符号将显示为:
[21:40:17]damon@damon:~/pyenv/bin$
注意时间是定格的
可以使用unset方法来取消PROMPT_COMMAND
git基础:
git是存在分支的,当前所在的git分支可以通过git branch来察看。
另外一种方式,获取.git/HEAD文件中的内容,格式是:
ref: refs/heads/BRANCH-NAME
于是有两种方案:
一,用下面指令替换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中的颜色知道当前的状态。
这儿有一份相关的说明:
http://aaroncrane.co.uk/2009/03/git_branch_prompt/
这儿有另一份中文说明: