2016-02-05 25 views
-2

我的終端現在正在同一行寫兩次。在它開始重複這條線之前,它也沒有走到盡頭。這是在我的.bash_profile與bash配置文件相同的終端寫入升級。

c_reset="$(tput setaf 2)" 
c_path="$(tput setaf 1)" 
c_git_dirty="$(tput setaf 1)" 
c_git_clean="$(tput setaf 2)" 
c_white="$(tput setaf 7)" 

PROMPT_COMMAND=$PROMPT_COMMAND' PS1="${c_path}\W${c_reset}$(git_prompt) :> "' 

export PS1='\n\[\033[0;31m\]\W\[\033[0m\]$(git_prompt)\[\033[0m\]:> ' 
git_prompt() 
{ 
    # Is this a git directory? 
    if ! git rev-parse --git-dir > /dev/null 2>&1; then 
    return 0 
    fi 
    # Grab working branch name 
    git_branch=$(git branch 2>/dev/null| sed -n '/^\*/s/^\* //p') 
    # Clean or dirty branch 
    if git diff --quiet 2>/dev/null >&2; then 
    git_color="${c_git_clean}" 
    else 
    git_color=${c_git_dirty} 
    fi 
    echo "${c_white}[$git_color$git_branch${c_white}]" 
} 

我得到了什麼代碼劑量。但我的問題是它仍然寫在同一行。我已經嘗試了其他的做法。使用\ 003 [0; 31m type命令設置顏色。

我想要做的是讓它告訴我什麼時候我的git很髒。現在它在我開始的終端上寫同一行。它甚至在嘗試[]時也會這樣做。有人可以告訴我如何解決這個問題,以及PROMPT_COMMAND如何工作。

+0

這是一種常見的常見問題,並沒有真正一個編程問題。見例如http://unix.stackexchange.com/questions/31642/bash-prompt-command-messing-up-scroll-history-display – tripleee

回答

0

這兩條線

PROMPT_COMMAND=$PROMPT_COMMAND' PS1="${c_path}\W${c_reset}$(git_prompt) :> "' 

export PS1='\n\[\033[0;31m\]\W\[\033[0m\]$(git_prompt)\[\033[0m\]:> ' 

足夠討論這個問題:在後者中,\[\]雙環繞你告訴bash在提示符的打印寬度不計的文字。但在PROMPT_COMMAND您正在重置PS1具有類似的字符串(轉義序列)bash不知道主要是非打印字符。因此bash將這些轉義序列中的字符數計爲每個字符一列。它會讓你感到困惑,這條線(帶有提示和你正在編輯的任何命令)可能會持續多久。

的解決將是審查PROMPT_COMMAND並添加這些標記在適當情況下,例如,像這樣(未經):

PROMPT_COMMAND=$PROMPT_COMMAND' PS1="${c_path}\W\[${c_reset}$(git_prompt)\] :> "' 

尋址註釋:

  • export導致該值PS1將被放入環境,以便例如如果您運行子殼(開始bash,然後在內運行bash),子shell可以使用PS1的值。
  • PROMPT_COMMAND設置PS1每次你得到提示。
  • 在命令,$()界定命令(如功能git_prompt),而${}界定變量(事有一個值,而不像命令不被評估或執行)。

延伸閱讀:

+0

我測試了這個,它沒有工作。我有幾個問題。 PROMPT_COMMAND = $ PROMPT_COMMAND'其他東西' 這是否設置了一個系統變量本身加上其他的東西? – user1519219

+0

也@Thomas謝謝。 導出PS1是做什麼的? 爲什麼一些var用{}和其他用()包起來?我只理解它的一半是如何工作的。 我不想做兩個職位,但我準備在我準備好之前輸入。 – user1519219

相關問題