2012-11-19 55 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'都没有任何好处重新运行“虚拟”功能以赋予它新的价值。 –