在微博上看到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/
這兒有另一份中文說明: