web-dev-qa-db-ja.com

色付けされた出力は、シェルリダイレクトを介してキャプチャできますか?

私が使用するさまざまなbashコマンド-派手なdiff、ビルドスクリプトなど、多くのカラー出力を生成します。

この出力をファイルにリダイレクトしてから、後でcatまたはlessファイルにリダイレクトすると、色付けがなくなります。おそらく、出力をリダイレクトする行為によって、端末に色を変更するように指示します。

カラー化など、カラー化された出力をキャプチャする方法はありますか?

70
billc

カラー化された出力をキャプチャする1つの方法は、scriptコマンドを使用することです。 scriptを実行すると、bashセッションが開始され、すべての生の出力がファイル(デフォルトではTypeScriptという名前)にキャプチャされます。

51
ataylor

リダイレクトでは色は取り除かれませんが、多くのコマンドは端末に出力を送信していることを検出し、そうでない場合はデフォルトで色を生成しません。たとえば、Linux ls --color=auto(多くの場所でプレーンlsにエイリアスされます)は、パイプまたはファイルに出力する場合、カラーコードを生成しませんが、ls --color意志。他の多くのツールには、色付きの出力をファイルに保存するための同様のオーバーライドフラグがありますが、すべて個別のツールに固有のものです。

ファイルにカラーコードが含まれている場合でも、それらを確認するには、そのままにしておくツールを使用する必要があります。 lessには-rフラグは、「生」モードでファイルデータを表示します。これにより、色コードが表示されます。 編集:少し新しいバージョンには、カラーコードを特に認識して適切に表示する-Rフラグもあります。制御コードと、実際に画面に表示される文字です。

34
Walter Mundt

他の回答に触発されて、scriptを使い始めました。ただし、_-c_を使用して動作させる必要がありました。 tee、さまざまなscriptの例を含む他のすべての回答は、私にとってはうまくいきませんでした。

環境:

  • Ubuntu 16.04
  • behaveを使用して動作テストを実行し、Pythonのsubprocess.check_call()を使用してテスト中にシェルコマンドを開始する

解決:

_script --flush --quiet --return /tmp/ansible-output.txt --command "my-ansible-command"
_

スイッチの説明:

  • _--flush_が必要でした。それ以外の場合、出力は十分にライブ観測可能ではなく、大きなチャンクで表示されるためです。
  • _--quiet_は、スクリプトツールの独自の出力を抑制します
  • _-c, --command_は実行するコマンドを直接提供します。コマンドからスクリプトへのパイピングは機能しませんでした(色なし)
  • _--return_は、スクリプトがコマンドの終了コードを伝播するようにし、コマンドが失敗したかどうかを確認します
12
geekQ

一部のプログラムは、出力がTTYではないことに気付いたとき(つまり、別のプログラムにリダイレクトしたとき)に色付けを削除します。それらのいくつかに色を強制的に使用するように指示し、ページャーに色付けをオンにするように指示できます。たとえば、less -R

10
alvherre

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

そのため、scriptstdinを混乱させず、まさに私が望むものを取得します。これはcommand | lessと同等ですが、ファイルに追加された新しいコンテンツを読み続けながら色を保持します(私が試した他の方法はそうしませんでした)。

8
Joels Elf

この質問 スーパーユーザーの終わり その他の回答teeを含む)が機能しなかったときに助けてくれましたunbufferを使用して、コマンドがシェルから実行されていると見なすようにします。

Sudo apt install expect tclではなくSudo apt-get install expect-devを使用してインストールしました。

皮肉なことにaptの出力をリダイレクトするときに、このメソッドを使用する必要がありました。

2
Richard Wiseman