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

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

鉱山では、.bashrcANSI端末の色コードを使用して個々のビットの色を指定します。次のようになります。

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

wherevirtual_envgit_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

カラーコード変数の使い方は?

答え1

解決策は、プロンプトを定義するときにシェルにカラー変数を置き換えさせることです。しかし、関数はそうではありません。これを行うには、最初に試したように二重引用符を使用しますが、ヒントが描画される前に評価されないようにコマンドをエスケープします。

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

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

答え2

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

制御文字をGREEN(andYELLOWRESET)に手動で入れることができますが、より良いオプションはtput最初に使用することです。これにより、何もハードコーディングする必要がなく、すべての端末タイプがサポートされます。

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

「バックスラッシュ0 3 3」などを直接入力すると表示されるのは、特定のバックPS1スラッシュシーケンスの解釈が次のようになるためです。特徴bashのプロンプト(マニュアルのPROMPTINGセクションを参照)この置換が発生します。今後ただし、パラメータ拡張、コマンド置換、算術拡張、引用符の削除などは、他のすべての操作の結果には適用されません。

答え3

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

関連情報