私が使用するさまざまなbashコマンド-派手なdiff、ビルドスクリプトなど、多くのカラー出力を生成します。
この出力をファイルにリダイレクトしてから、後でcat
またはless
ファイルにリダイレクトすると、色付けがなくなります。おそらく、出力をリダイレクトする行為によって、端末に色を変更するように指示します。
カラー化など、カラー化された出力をキャプチャする方法はありますか?
カラー化された出力をキャプチャする1つの方法は、script
コマンドを使用することです。 script
を実行すると、bashセッションが開始され、すべての生の出力がファイル(デフォルトではTypeScript
という名前)にキャプチャされます。
リダイレクトでは色は取り除かれませんが、多くのコマンドは端末に出力を送信していることを検出し、そうでない場合はデフォルトで色を生成しません。たとえば、Linux ls --color=auto
(多くの場所でプレーンls
にエイリアスされます)は、パイプまたはファイルに出力する場合、カラーコードを生成しませんが、ls --color
意志。他の多くのツールには、色付きの出力をファイルに保存するための同様のオーバーライドフラグがありますが、すべて個別のツールに固有のものです。
ファイルにカラーコードが含まれている場合でも、それらを確認するには、そのままにしておくツールを使用する必要があります。 less
には-r
フラグは、「生」モードでファイルデータを表示します。これにより、色コードが表示されます。 編集:少し新しいバージョンには、カラーコードを特に認識して適切に表示する-Rフラグもあります。制御コードと、実際に画面に表示される文字です。
他の回答に触発されて、script
を使い始めました。ただし、_-c
_を使用して動作させる必要がありました。 tee
、さまざまなscript
の例を含む他のすべての回答は、私にとってはうまくいきませんでした。
環境:
behave
を使用して動作テストを実行し、Pythonのsubprocess.check_call()
を使用してテスト中にシェルコマンドを開始する解決:
_script --flush --quiet --return /tmp/ansible-output.txt --command "my-ansible-command"
_
スイッチの説明:
--flush
_が必要でした。それ以外の場合、出力は十分にライブ観測可能ではなく、大きなチャンクで表示されるためです。--quiet
_は、スクリプトツールの独自の出力を抑制します-c, --command
_は実行するコマンドを直接提供します。コマンドからスクリプトへのパイピングは機能しませんでした(色なし)--return
_は、スクリプトがコマンドの終了コードを伝播するようにし、コマンドが失敗したかどうかを確認します一部のプログラムは、出力がTTYではないことに気付いたとき(つまり、別のプログラムにリダイレクトしたとき)に色付けを削除します。それらのいくつかに色を強制的に使用するように指示し、ページャーに色付けをオンにするように指示できます。たとえば、less -R
Lessはインタラクティブなので、script
へのパイピング時に色を保持するためにless
を使用しても実際には機能しません(すべてが台無しになり、終了時にbashが台無しになります)。 script
は、終了した後でもstdin
からの入力を本当に混乱させるようです。
したがって、実行する代わりに:
script -q /dev/null cargo build | less -R
Lessにパイプする前に/dev/null
をリダイレクトします:
script -q /dev/null cargo build < /dev/null | less -R
そのため、script
はstdin
を混乱させず、まさに私が望むものを取得します。これはcommand | less
と同等ですが、ファイルに追加された新しいコンテンツを読み続けながら色を保持します(私が試した他の方法はそうしませんでした)。