git出力を変数としてキャプチャ

git出力を変数としてキャプチャ

サブシェルでコマンドを実行すると、標準出力を変数として収集できます。たとえば、次のようになります。

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はautoTTYに出力するときにのみ色を使用します。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引用メカニズムに関するもので、周囲には引用""符がなく、内部はトークン区切り文字として扱われます。$varnewlineblank space詳細については、bashのマニュアルを参照してください。

関連情報