2012-11-19 87 views
1

我一直在搞,試圖獲得一個新的有色PS1,如果我使用Python virtualenv,它可以自動告訴我。我非常,非常新的猛砸,所以經過一番研究,我創造了這樣的事情(簡化爲清楚起見):停止bash從字符串內部轉義字符串

function virtualenv { 
    if [ -n "$VIRTUAL_ENV" ]; then 
     VIRTUAL=" $BLACK($GREEN`basename $VIRTUAL_ENV`$BLACK)" 
    else 
     VIRTUAL="" 
    fi 
} 

PS1="$BLUE\[email protected]\h\$VIRTUAL $YELLOW\\$ $RESET" 

在希望$BLACK$GREEN變量將在PS1來解釋,而是我是這樣的:

[email protected] \e[30m(\e[32mmyproject\e[30m) $ 

彷彿的bash逃避我的整個VIRTUAL變量,對自己...我已經嘗試過的斜線,報價每一個組合,並命令我有限的技能使...任何幫助嗎?

+0

見行情時和逃避對擊黑客的Wiki:http://wiki.bash-hackers.org/syntax/quoting你想顏色字符串上的單引號。 –

+0

@ReubenMorais我只是嘗試了顏色字符串($ BLUE)和$ VIRTUAL變量中單引號的不同組合。我得到了相同的結果或像gabe @ notebook $ BLACK($ GREENmyproject $ BLACK)的文字表示。 – Gabe

+0

bash的哪個版本?如果它是4.x之前的版本,那麼它不理解'\ e'轉義;您必須使用'\ 033'(或'\ x1b',或通過鍵入control-V或...輸入的文字轉義)。 –

回答

0

您可以防止慶典在字符串替換變量,當你附上串入單引號

VIRTUAL=' $BLACK($GREEN`basename $VIRTUAL_ENV`$BLACK)' 

這將字符串存儲爲在變量VIRTUAL。如果您想替換其中的一部分,你必須關閉單引號和嵌入代部分爲雙引號

A=x 
B=y 
C=z 

V='$A$B$C' 
W='$A'"$B"'$C' 

將離開V$A$B$CW$Ay$C

+0

'W ='$ A'「$ B」'$ C''(保留'B'引用的分詞和全局擴展)將是更安全的做法。 –

+0

@CharlesDuffy謝謝,修正。 –

0

首先 - virtualenv函數不會像你這樣做。在PS1基於以下的評價實際上是調用你的函數(這是更好的未命名virtualenv):

function virtualenv_prompt { 
    [[ -n $VIRTUAL_ENV ]] && \ 
     printf %s " $BLACK($GREEN"'$(basename "$VIRTUAL_ENV"'"$BLACK)" 
} 

PS1="$BLUE\[email protected]\h"'$(virtualenv_prompt)'" $YELLOW\\$ $RESET" 

儘管如此,這仍然無法工作,你所希望的方式,因爲\[\]逃逸(必要,以防止shell從計算顏色代碼作爲用於換行的打印字符)需要直接包含在PS1中,並且不能被替換。

爲了使它正確,您不僅需要添加這樣的轉義符(如果它們不是已經不在代碼定義中了),還可以將顏色代碼移出virtualenv func讓他們無條件存在(即使顏色是來回切換,沒有可見的內容)。另請參見http://mywiki.wooledge.org/BashFAQ/053

0

您在這裏躲過了美元符號:\$VIRTUAL,因此$VIRTUAL分配給PS1時(因爲它變成文字$,你看到的)沒有得到擴大。

結果,$VIRTUAL僅被當它的時間來生成提示擴展,這就是爲什麼,而不是格式您所看到的串定義格式

基本上你只需要在\$VIRTUAL擺脫\的分配給PS1

+0

我試過了,忘了提及......我使用反斜槓來獲得\ $ VIRTUAL每次評估(我學到的一個技巧[here](http://stackoverflow.com/a/7359870/9835) )。如果我刪除它,着色工作,但可變內容不會更新,直到我再次加載bashrc(或重新打開終端) – Gabe

+0

@Gabe如果你不是每次評估'$ VIRTUAL'都沒有任何好處重新運行「虛擬」功能以賦予它新的價值。 –