web-dev-qa-db-ja.com

端末プロンプトでconda env変数を変更するにはどうすればよいですか?

端末プロンプトをカスタマイズしたいと思います。通常、conda環境がアクティブになると、環境の名前がPS1文字列の前に付加されます。これをもう少しカスタマイズしたいのですが、理解できませんでした。

_changeps1: false_を_.condarc_ファイルに追加すると、新しい環境をアクティブ化してもターミナルプロンプトが変更されません。次に、たとえば_.bash_profile_の環境変数を変更できます。

PS1+="\[${cyan}\]<$(basename $CONDA_DEFAULT_ENV)> ";

これは、ニンジンで囲む方法を色付けした環境の名前を返しますが、これは、_source .bash_profile_を実行した後にのみ機能します。環境をアクティブ化しても効果はなく、予期しないことではありません。

私の質問は、環境をアクティブ化するときにプロンプ​​トを更新する方法ですか、またはこれについてより良い方法がありますか?

これは この質問に関連しています

そして、これ の例のプロファイル ただし、環境をアクティブ化するときにプロンプ​​トが変更されないという問題が直接発生するわけではありません。

4
johnchase

ここでの問題は、二重引用符を使用し、直接コマンド置換を使用していることです。つまり、$(basename $CONDA_DEFAULT_ENV)(および_$CONDA_DEFAULT_ENV_)の値は、コードの行が実行され、逐語的文字列としてPS1に組み込まれます。

BashがPS1を処理する方法は、プロンプトが出力されるたびに$(...)シーケンスを評価するため、必要なことは、シーケンスをリテラル形式で保持することです(_$_ sをバックスラッシュでエスケープすることにより)。たとえば)、これはあなたが探している結果をもたらすはずです。

だからこれはうまくいくはずです:

_PS1+="\[${cyan}\]<\$(basename \$CONDA_DEFAULT_ENV)> ";
_

または、変数を二重引用符で囲んで、_$CONDA_DEFAULT_ENV_にスペースがある場合、または空または未設定の場合にbasenameコマンドが引き続き機能するようにします。

_PS1+="\[${cyan}\]<\$(basename \"\$CONDA_DEFAULT_ENV)\"> ";
_

_${cyan}_はエスケープしなかったことに注意してください。これは、変更されることは想定されていないため、1回だけ評価しても問題ありません...

メタ文字のエスケープ(_$_や_"_など)は、ある時点で重くなり始めるため、一重引用符を使用して文字列をそのまま保持することは、ある時点でおそらくより良い選択なので、それを実行できます。ただし、_${cyan}_を引き続き展開する必要があるため、エスケープを最小限に抑えて目的の結果を得るには、二重引用符と単一引用符を混ぜてみましょう。

_PS1+="\[${cyan}\]"'<$(basename "$CONDA_DEFAULT_ENV")> ';
_

最後にリセットせずに色をシアンに設定することでまだ問題があるかもしれません...しかし、フォーマットをリセットするコードで最後に別の_"\[${...}\]"_ブロックを追加することで簡単に修正できます(どこにあるかわからない)カラー定数が由来しているので、リセットコードを確認してください。)ただし、PS1に追加してさらに変更する行があり、色も変更している場合は、特定の環境で問題にならない可能性があります。 (私が想像するのはあなたのケースです。あなたがあなたのプロフィールを手に入れるときはいつでもあなたがあなたが持っているものはうまくいくと言うからです。)

4
filbranden