在微博上看到ghosTM55在終端能夠實時展示出當前運行的分支,以爲很奇特,因而google了一把。這裏面存在兩個內容,第一個bash,第二個是githtml
bash基礎:linux
瞭解到linux的shell存在PS1, PS2,PS3, PS4,這些都做爲環境變量存在。git
PS1表示的默認交互提示,在ubuntu-12.04中的默認值是 "\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$",也就是咱們一般能夠看到的:shell
damon@damon:~/pyenv/bin$ ubuntu
在PS1中bash
\u -- 表示用戶名ui
\h -- 表示主機名google
\w -- 當前目錄的全局路徑,若是是home目錄,顯示~spa
\s -- 表示的bash.net
\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的進程,開銷會有些大。
2、先定義一個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
這樣就能夠在PS1中的顏色知道當前的狀態。
green=$'\e[1;32m' magenta=$'\e[1;35m' normal_colours=$'\e[m' PS1="\[$green\]\u@\h:\w\[$magenta\]\$git_branch\[$green\]\\$\[$normal_colours\] "
這兒有一份相關的說明:
http://aaroncrane.co.uk/2009/03/git_branch_prompt/
這兒有另外一份中文說明: