鉱山では、.bashrc
ANSI端末の色コードを使用して個々のビットの色を指定します。次のようになります。
PS1='\u@\h:\w\[\033[33m\]$(virtual_env)\[\033[32m\]$(git_branch)\[\033[0m\]$ '
wherevirtual_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
カラーコード変数の使い方は?
答え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
(andYELLOW
とRESET
)に手動で入れることができますが、より良いオプションは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}$ '