web-dev-qa-db-ja.com

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

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

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

ここで、virtual_envおよびgit_branchは、stdoutに出力する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を使用し、色に単一引用符を使用し、代わりに\[\]PS1に入れます色変数ですが、何も機能しないようです。

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

33
Ismail Badawi

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

_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\]$ 
_

ご覧のとおり、カラー変数は置き換えられましたが、コマンドは置き換えられていません。

20
Patrick

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

制御文字をGREEN(およびYELLOWRESET)に手動で入力することもできますが、より適切なオプションは、最初にtputを使用して、何もハードコーディングする必要はなく、あらゆる端末タイプをサポートします。

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

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

7
Celada

$ 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}$ '
2
Cyrus