サブシェルでコマンドを実行すると、標準出力を変数として収集できます。たとえば、次のようになります。
var=$(echo 'hello world')
echo $var
期待どおり「hello world」を印刷します。
色と新しい行を追加しても機能します。
var=$(echo "Text in \n\e[34mBlue")
echo -e $var
予想通り、「blue」という単語を使用して、次の行に「blue text」を印刷します。
しかし、次のようなgit出力を使用しようとすると
var=$(git status)
echo $var
すべての改行文字と色が失われます。
bashでフォーマットと色を維持しながらgitコマンドの出力をキャプチャして後で印刷する方法は?
答え1
デフォルト値は次のとおりです。子color.ui
の設定isはauto
TTYに出力するときにのみ色を使用します。always
出力に色を付けるように設定を変更できます。
あなたのユースケースに最も有用なのは構成値のオーバーライドを許可する-c
オプションgit
現在のコマンドにのみ適用されます。これを使用してcolor.ui
以下を設定できますalways
。
var=$(git -c color.ui=always status)
printf '%s\n' "$var"
2番目の例では
var=$(echo "Text in \n\e[34mBlue")
echo -e $var
実際にecho -e
色が現れる行です。エスケープコードは命令置換によって内部的に解釈されず、echo
バックスラッシュやその他の文字が実際に存在します。カラーコードが当時保存されたが、生成時に忘れられたという意味ではありません。git
あるケースでは最後に生成されたが、別のケースではまったく生成されなかった。
答え2
この試み:
var=$(git status)
echo "$var"
これはbash引用メカニズムに関するもので、周囲には引用""
符がなく、内部はトークン区切り文字として扱われます。$var
newline
blank space
詳細については、bashのマニュアルを参照してください。