我是Bash編程的新手,我正在創建一個自定義Bash命令提示符。我的目標是創建一個提示,當它們與我通常使用的不同時,它只顯示登錄名和主機名。我還希望在Git版本控制下的目錄中追加當前的Git分支到命令提示符。
我想登錄和主機名部分綠色,目錄路徑藍色,Git分支部分粉紅色和分隔符(:和$字符)爲白色。但是,當以前執行的命令返回零以外的任何東西時,我想爲$ separator紅色着色。無顏色的一般格式如下所示:
[email protected]:~/current/path:branchname$
唯一必需的部分是目錄路徑和$字符。下面是我爲我的的.bashrc文件編寫的代碼:
MYNAME="gwen"
MYHOST="gwen-laptop"
RED="\[\033[31m\]"
WHITE="\[\033[0m\]"
GREEN="\[\033[01;32m\]"
BLUE="\[\033[01;34m\]"
PINK="\[\033[01;35m\]"
DOLLAR="if [ \$? = 0 ]; then echo ${WHITE}\$; else echo ${RED}\$${NORMAL}; fi"
GITBRN='$(__git_ps1 "\033[0m:\033[01;35m%s")'
USERNM="if [ \u != ${MYNAME} ]; then whoami; fi;"
HOSTNM="if [ \h != ${MYHOST} ]; then echo -n @; hostname; fi;"
COLONM="if [ \u != ${MYNAME} ] || [ \h != ${MYHOST} ]; then echo -n :; fi;"
PS1="${GREEN}\`${USERNM}\`\`${HOSTNM}\`${WHITE}\`${COLONM}\`${BLUE}\w${GITBRN}\`${DOLLAR}\` "
此代碼滿足我所有的要求,除了它葉子$字符在任何時候都白,不着色它在紅適當的時間。 (我懷疑問題在於DOLLAR中的「\ $?」引用了先前執行的命令,但是在構造PS1時最後執行了DOLLAR,因此之前的執行語句不再是PS1構造開始之前運行的命令;它是這是爲了創建命令提示符而執行的。)我是不知道如何解決這個問題。
此代碼很難看,需要重構。我試圖將所有的顏色代碼移動到它們自己的變量中,但是當我在GITBRN的代碼中使用這些顏色變量時,事情變得不合時宜,所以我最終使用了文字顏色。
我花了整整一天的時間試圖讓這段代碼正常工作,而且我想我現在在這裏沒有任何地方。任何建議如何讓這個美元符號在適當的時候變成紅色,將不勝感激。我也願意重新構建代碼,使其更清晰,更具可讀性。
P.S.我是Ubuntu Linux(Lucid Lynx)用戶。
與您手邊的問題無關:我相信這足以做到if(hostnamecondition);然後HOSTNM ='';其他HOSTNM =「@ $(主機名)」; fi'或類似的東西。我不認爲主機名通常會改變:當你ssh到另一臺機器時,你在那裏產生一個新的bash,這將再次運行你的代碼。 每次顯示提示時都不檢查主機名將會有輕微的性能優勢。 –
這裏的問題是,你的提示定義包含執行的命令,它會在運行後設置'$?'。您只需要將其複製到自定義變量中,但我無法完成範圍問題,因此下面的答案仍然是現在最好的解決方案。 – IMSoP