1

Python virtualenv を使用しているかどうかを自動的に教えてくれる.bashrc新しい色を取得しようとして、をいじっています。PS1私は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$GREEN変数が で解釈されることを期待していますがPS1、代わりに次のような結果が得られました。

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

あたかも Bash が自分のVIRTUAL変数全体を単独でエスケープしているかのように... スラッシュ、引用符、およびコマンドのすべての組み合わせを、自分の限られたスキルで許可されているものすべて試しました...何か助けはありますか?

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プロンプトを生成するときにのみ展開されます。そのため、フォーマットの代わりに、フォーマット定義する文字列が表示されます。

基本的に、に割り当てるときに\inを取り除く必要があります\$VIRTUALPS1

于 2012-11-19T13:35:27.640 に答える