別のプロセスにパイプすると、ANSIエスケープコードはどこに移動しますか?保管してもいいですか?


36

プロセス用に色分けされた出力をパイプしたい場合があります。grep ...しかし、私がそれを別のプロセスにパイプするとき、例えば。sed、カラーコードは失われます...

コードをそのまま保持する方法はありますか?

色付きの出力が失われる例を次に示します。

echo barney | grep barney | sed -n 1,$\ p   

4
PS ..一般情報として.. less色付きテキスト入力を受け付けることができることを発見しました(nice :) ... eg:tree -C ~/ |less -Rまたはls -lR --color=always . |less -R
Peter.O

回答:


40

カラー出力を生成する多くのプログラムは、TTYに書き込んでいるかどうかを検出し、そうでない場合は色をオフにします。これは、テキストをキャプチャするだけの場合、カラーコードは迷惑なため、自動的に「正しいことをしよう」とするためです。

そのようなプログラムからカラー出力をキャプチャする最も簡単な方法は、TTYに接続されていない場合でもカラーを書き込むように指示することです。そのオプションがあるかどうかを確認するには、プログラムのドキュメントを読む必要があります。(たとえば、オプションgrepがあり--color=alwaysます。)

このexpectスクリプトunbufferを使用して、次のような擬似ttyを作成することもできます。

echo barney | unbuffer grep barney | sed -n 1,$\ p

2
TTY検出とアンバッファーフェイクアウトに関する情報をありがとう!
シェルター

@cjm ..ここでは動作しません(Ubuntu 10.04 / bash 4.1.5で)...しかし、私の10.04リポジトリには-devバージョンしかなく、バックポートには何もありません...ここでは少し遅れているので、見てみましょう明日も...しかし、あなたが言ったように、これらの色付けプログラムはおそらく出力先に応じてトグルします(mhhhしかしどうすればtty ..に関係なくそれがgoiongであることを知っていますか?)それ..ありがとう、、、
Peter.O

@fred、彼らは一般にisattyを使用してどこstdoutに行くのかを見つけます。unbufferあなたがプログラムにパイプを入れているときも、プログラムからパイプを抜いているときにも機能するかどうかは実際にはわかりません。試してみるためにここにインストールしていません。
cjm

unbuffer情報のおかげで、シェルの出力のようにIRCボットの出力に役立ちます。
LiuYan刘研

4

わたしにはできる ;-!(現在のMingW環境で)

echo barney | grep --color=always barney | sed -n '1,$p'
**barney**

#barneyは赤いテキストとして表示されます

$ grep --version
GNU grep 2.5.4

$ sed --version
GNU sed version 4.2.1

@shellter ...はい、この特定のgrepの例は私にも役立ちます。答えを投稿するまで、私はそのオプションを知りませんでした。これを行う一般的な方法があるかどうか、まだ疑問に思っています....例えばtree is colorized a-la dircolors if the LS_COLORS environment variable is set and output is to tty ...多分(?)パイプをだましてTTYに出力していると思わせる方法があります。 。
Peter.O

私はちょうどチェックしたman treeそれはあまりにも同様のオプションを持っている...、-C...おそらくそれは、プログラムのための共通の特徴は、出力カラーエスケープコード...
Peter.O
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.