1

我一直在搞乱.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"

希望$BLACKand$GREEN变量将被解释为PS1,但我得到了这样的东西:

gabe@notebook \e[30m(\e[32mmyproject\e[30m) $

好像 BashVIRTUAL自己在逃避我的整个变量...我已经尝试了斜线、引号和命令的所有组合,我的有限技能允许...有帮助吗?

4

3 回答 3

0

当您将字符串括在单引号中时,您可以防止 bash 替换字符串中的变量

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

这会将字符串按原样存储在变量中VIRTUAL。如果你想替换它的一部分,你必须关闭单引号并将替换部分嵌入到双引号中

A=x
B=y
C=z

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

将离开Vas$A$B$CWas $Ay$C

于 2012-11-19T13:28:58.647 回答
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"

也就是说,这仍然无法按照您想要的方式工作,因为\[\]转义(有必要防止外壳将颜色代码计算为用于换行的打印字符)需要直接包含在 中PS1,并且不能替换为.

为了使它正确,您不仅需要添加这样的转义符(如果它们不在代码定义中),还需要将颜色代码移出virtualenv函数并无条件地存在(即使颜色正在切换回来并且第四,没有可见的内容)。另见http://mywiki.wooledge.org/BashFAQ/053

于 2012-11-19T13:34:43.913 回答
0

您在这里转义了美元符号: \$VIRTUAL,因此$VIRTUAL在分配给时不要扩展PS1(因为它变成了文字$,你看)。

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

\基本上你只需要在\$VIRTUAL分配给时摆脱PS1

于 2012-11-19T13:35:27.640 回答