阻止bash转义字符串中的字符串

时间:2012-11-19 02:11:31

标签: bash ps1

我一直在忙着.bashrc,试图获得一个新的彩色PS1,如果我使用的是Python virtualenv,它可以自动告诉我。我对Bash非常非常新,所以经过一些研究我创造了这样的东西(简化为了清晰):

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

PS1="$BLUE\u@\h\$VIRTUAL $YELLOW\\$ $RESET"

希望在$BLACK中解释$GREENPS1变量,但我得到的是这样的内容:

gabe@notebook \e[30m(\e[32mmyproject\e[30m) $
好像Bash独自逃离了我的整个VIRTUAL变量......我已经尝试过我的有限技能允许的斜线,引号和命令的每一种组合......任何帮助?

3 个答案:

答案 0 :(得分:0)

当您将字符串括在单引号

中时,可以阻止bash替换字符串中的变量
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$C,将W保留为$Ay$C

答案 1 :(得分:0)

首先 - virtualenv函数不会像你那样被调用。以下实际上在virtualenv评估期间调用了您的函数(最好不要命名为PS1):

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

PS1="$BLUE\u@\h"'$(virtualenv_prompt)'" $YELLOW\\$ $RESET"

也就是说,这仍然不会按照你想要的方式工作,因为\[\]转义(防止shell计算颜色代码作为换行符打印字符所必需的)直接包含在PS1中,不能替换为。

为了使其正确,您不仅需要添加此类转义(如果它们尚未包含在代码定义中),还需要将颜色代码移出virtualenv函数并使其无条件存在(即使颜色来回切换,没有可见的内容)。另请参阅http://mywiki.wooledge.org/BashFAQ/053

答案 2 :(得分:0)

您在此处转义了美元符号:\$VIRTUAL,因此$VIRTUAL在分配给PS1时不会展开(因为它成为文字$,您看到了)

因此,$VIRTUAL只有在生成提示时才会展开,这就是为什么而不是格式化,您会看到定义格式的字符串

基本上,在分配给\

时,您必须摆脱\$VIRTUAL中的PS1