変数を使用してPS1のターミナルカラーコードを格納しますか?


33

私の.bashrcでは、ANSIターミナルのカラーコードを使用して、さまざまなビットを色分けしています。次のようになります。

PS1='\u@\h:\w\[\033[33m\]$(virtual_env)\[\033[32m\]$(git_branch)\[\033[0m\]$ '

どこvirtual_envgit_branch標準出力に出力のものというbashの関数です。

さて、読みやすく変更しやすくするために、色コードを直接に埋め込むのではなく、変数に色コードを保存して参照したいと思いPS1ます。だから私はこのような変数の束を持っています:

GREEN="\[\033[32m\]"
YELLOW="\[\033[33m\]"
RESET="\[\033[0m\]"

次のようなものを書きたいです。

PS1='\u@\h:\w${YELLOW}$(virtual_env)${GREEN}$(git_branch)${RESET}$ '

しかし、これは機能しません-エスケープされているように、色コードがプロンプトに表示されます。代わりに二重引用符を使用すると、色は正しく機能PS1しますが、プロンプトは変更したときにのみ変化しますsource ~/.bashrc

私は人々が見た他のことを試しました-をprintf使用して、色に一重引用符を使用し、色変数の代わりに\[and \]を入れPS1ますが、何もうまくいかないようです。

カラーコードに変数を使用するにはどうすればよいですか?


教えていただけます.bashrcか?
cuonglm 14

@cuonglmすべての.bashrcは私たちのものですか?見せてあげます。
CivFan

回答:


20

解決策は、プロンプトを定義するときに、関数ではなく色変数をシェルに代入させることです。これを行うには、最初に試したように二重引用符を使用しますが、プロンプトが表示されるまでコマンドが評価されないようにコマンドをエスケープします。

PS1="\u@\h:\w${YELLOW}\$(virtual_env)${GREEN}\$(git_branch)${RESET}$ "

各コマンドの\前に注意してください$()

これをエコーすると、次のように表示されます。

echo "$PS1"
\u@\h:\w\[\033[33m\]$(virtual_env)\[\033[32m\]$(git_branch)\[\033[0m\]$ 

ご覧のとおり、色変数は置換されましたが、コマンドは置換されませんでした。


1
$(git_branch)が$ {YELLOW}などを使用して印刷しようとしている場合、これは機能しないようです。そのセクションだけで、すべての[]文字を取得できます。
WBリード

7

問題は、変数GREENに「バックスラッシュブラケットバックスラッシュゼロスリースリー」などで構成されるリテラル文字列が含まれていることです。端末に色を変更するために必要なASCIIエスケープ文字などは含まれていません。

あなたはに制御文字を入れることができますGREEN(とYELLOWRESET)手動ではなく、より良いオプションが使用することですtputあなたは、ハードコードは何も知らなくても済むように、最初の場所で、あなたは任意の端末タイプをサポートします。

GREEN="$(tput setaf 2)"
YELLOW="$(tput setaf 3)"
RESET="$(tput setaf 0)"

「バックスラッシュゼロスリースリー」などを直接入力PS1すると、特定のバックスラッシュシーケンスの解釈がbashのプロンプトの機能であるためです(マニュアルのセクションPROMPTINGを参照してください。この置換はパラメーター展開、コマンドの前に発生ますただし、代入、算術展開、および引用符の削除は、他のすべての操作の結果には適用されません。


5
この方法で実行する場合は、色変数を\[\]内にラップする必要があります$PS1。例:PS1='\u@\h:\w\[${YELLOW}\]'。これを行わずに、次の行に折り返す長いコマンドで終わる場合、あらゆる種類の問題が発生します。シェルはを使用して、\[\]どの文字を印刷できないかを判断するため、プロンプトの長さの計算にそれらを考慮しません。これは、端末の幅を超えたときに適切に線を描画できるようにするために必要です。
パトリック14

知りませんtputでした、ありがとう。とりあえずPatrickの回答を使用しますが、機会があればこれを再訪します。
イスマイルバダウィ14

2

$ GREEN、$ YELLOW、および$ RESETの入力方法を変更します。

GREEN="$(echo -e "\033[32m")"
YELLOW="$(echo -e "\033[33m")"
RESET="$(echo -e "\033[0m")"

PS1='\u@\h:\w${YELLOW}$(virtual_env)${GREEN}$(git_branch)${RESET}$ '

1
これは実質的に、Celadaの答えとまったく同じことを行います。ただし、端末がカラー設定に異なるエスケープコードを使用する場合、Celadaの方がよりポータブルです。また、複数行のプロンプトについても同じ問題が発生します。
パトリック14

2
\[…\]ビットは、あなたが変数に詰め込むことができない、プロンプトのままにする必要があります。これをすべて削除したため、表示の問題が発生します(bashが期待する位置にカーソルがありません)。
ジル「SO-停止が悪さ」

@Patrickの懸念は別として、echo -eは移植性がありません。
ヘルパーメソッド14

1
移植性がtput setafない場合、より多くの機能が提供されます。ライトシアンなどの「明るい」色のセットから選択することはできません。しかし、@ Cyrusの答えはそうです。
CivFan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.