私の.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
に入れます色変数ですが、何も機能しないようです。
色コードに変数を使用するにはどうすればよいですか?
解決策は、プロンプトではなく関数を定義するときに、シェルにカラー変数を代入させることです。これを行うには、最初に試みたように二重引用符を使用しますが、コマンドをエスケープして、プロンプトが表示されるまでコマンドが評価されないようにします。
_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\]$
_
ご覧のとおり、カラー変数は置き換えられましたが、コマンドは置き換えられていません。
問題は、変数GREEN
に「バックスラッシュブラケットバックスラッシュゼロスリースリースリー」などのリテラル文字列が含まれていることです。たとえば、端末の色を変更するために必要なASCIIエスケープ文字は含まれていません。
制御文字をGREEN
(およびYELLOW
とRESET
)に手動で入力することもできますが、より適切なオプションは、最初にtput
を使用して、何もハードコーディングする必要はなく、あらゆる端末タイプをサポートします。
GREEN="$(tput setaf 2)"
YELLOW="$(tput setaf 3)"
RESET="$(tput setaf 0)"
「バックスラッシュゼロスリースリースリー」などを直接PS1
は、特定のバックスラッシュシーケンスの解釈がbashのプロンプトの機能であることです(マニュアルのセクション「プロンプト」を参照してください。この置換は発生しますbeforeパラメータ拡張、コマンド置換、算術拡張と引用の削除ですが、他のすべての操作の結果には適用されません。
$ 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}$ '