GNU/Linux >> Linux の 問題 >  >> Linux

StderrとStdoutを異なる色で印刷するようにシェルを構成しますか?

stderrのように端末を設定したい stdoutとは異なる色で印刷されます;多分赤。これにより、2つを区別しやすくなります。

.bashrcでこれを構成する方法はありますか ?そうでない場合、これも可能ですか?

:この質問は、 stderrを要求する別の質問とマージされました 、 stdout およびユーザー入力エコー 3つの異なる色で出力されます 。答えはどちらの質問にも当てはまるかもしれません。

承認された回答:

これは、画面にstderrのみを表示するのが難しいバージョンですが、stdoutとstderrの両方をファイルに書き込みます。

ターミナルで実行されているアプリケーションは、単一のチャネルを使用してターミナルと通信します。アプリケーションにはstdoutとstderrの2つの出力ポートがありますが、どちらも同じチャネルに接続されています。

それらの1つを別のチャネルに接続し、そのチャネルに色を追加し、2つのチャネルをマージできますが、これにより2つの問題が発生します。

  • マージされた出力は、リダイレクトがなかったかのように正確に同じ順序ではない場合があります。これは、チャネルの1つに追加された処理に(少し)時間がかかるため、色付きのチャネルが遅延する可能性があるためです。バッファリングが行われると、障害はさらに悪化します。
  • 端末は、色を変更するエスケープシーケンスを使用して、表示色を決定します。 ␛[31m 「赤い前景に切り替える」という意味です。これは、stderrの出力が表示されているのと同じように、stdout宛ての出力が到着した場合、出力の色が変わることを意味します。 (さらに悪いことに、エスケープシーケンスの途中にチャネルスイッチがあると、ゴミが表示されます。)

原則として、2つのpty¹を同期的にリッスンし(つまり、一方のチャネルで入力を受け入れず、もう一方のチャネルで出力を処理する)、適切な色変更命令ですぐに端末に出力するプログラムを作成することができます。ターミナルと対話するプログラムを実行する機能が失われます。このメソッドの実装については知りません。

別の可能なアプローチは、 write を呼び出すすべてのlibc関数をフックすることにより、プログラムに適切な色変更シーケンスを出力させることです。 LD_PRELOADがロードされたライブラリのシステムコール 。既存の実装についてはsickillの回答を、 straceを活用する混合アプローチについてはStéphaneChazelasの回答をご覧ください。 。

実際には、それが該当する場合は、stderrをstdoutにリダイレクトし、colorgccやcolormakeなどのパターンベースのcolorizer、またはcolorgccやcolormakeなどの専用のcolorizerにパイプすることをお勧めします。

関連:既存のシェルスクリプトを使用してオートマターサービスから/ volume /を削除するにはどうすればよいですか?

¹疑似端末。バッファリングが原因でパイプが機能しませんでした。ソースがバッファに書き込む可能性があり、これによりカラーライザーとの同期が失われます。


Linux
  1. Linuxで出力をファイルとStdoutにリダイレクトする方法

  2. コマンドの出力をシェル変数に割り当てる方法は?

  3. Stdoutに出力し、同時にGrepをファイルに出力しますか?

  1. StderrとStdoutを別のファイルにリダイレクトし、ターミナルに表示するにはどうすればよいですか?

  2. コマンドまたはシェルスクリプトの出力がStdoutまたはStderrであるかどうかを確認する方法は?

  3. 画面にStderrのみを表示しますが、StdoutとStderrの両方をファイルに書き込みますか?

  1. 出力をファイルと標準出力にリダイレクトする方法

  2. XTerm または Konsole で stdout と stderr の出力を異なる色にすることはできますか?

  3. すべての出力を Bash のファイルにリダイレクトします