stdin/stderr リダイレクト、パイプ、色

stdin/stderr リダイレクト、パイプ、色

私はこの質問について多くの順列を見ましたが、それらのどれもまったく重複していないと思います。

保持しながら、stderr(または最終的にstderrとstdin)のみをファイルにコピーできます。カラフル画面に出力(ファイルにも色があると良いと思います)

答え1

各コマンドには、他の回答に示すように、常にカラーエスケープコードを送信する特別なコマンドがあります。ただし、より一般的なアプローチは、次のツールを使用することです。

バッファリング解除

unbuffer ls -l --color=auto | tee output.log

unbufferの命令です予想されるパック。

参照番号スーパーユーザー - Tシャツに配管するときに色を維持する

スクリプト

script --flush --quiet --command "ls -l --color=auto" | tee output.log

scriptの命令ですユーティリティLinuxパック。

参照番号StackOverflow - シェルリダイレクトでカラー出力をキャプチャできますか? [コピー]

答え2

パイピングやリダイレクトで色は削除されません!


使用する初期コマンドで出力が端末ではないことを確認すると、色が削除されます。したがって、この質問に対する一般的な回答としては使用できません。

たとえば、以下を参照してくださいman ls

lsカラーコードは、標準出力が端末に接続されている場合にのみ表示されます。

を使用して動作を変更できます--color=always

また適用されますgrep

   --color[=WHEN], --colour[=WHEN]
          Surround  the  matched (non-empty) strings, matching lines, context lines, file names, line numbers, byte offsets, and separators (for fields
          and groups of context lines) with escape sequences to display them in color on the terminal.  The  colors  are  defined  by  the  environment
          variable  GREP_COLORS.   The  deprecated environment variable GREP_COLOR is still supported, but its setting does not have priority.  WHEN is
          never, always, or auto.

たとえば、

echo 123 | grep --color=always 2 | tee file

...2端末とファイルの出力に色を提供します。

出力には色が含まれていますが、いいえファイルで次の質問に対する回答を確認できます。この問題次に、次のように実行します。

echo 123 | grep --color=always 2 | tee /dev/tty | ansi2txt > file

関連情報