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 /を削除するにはどうすればよいですか?¹疑似端末。バッファリングが原因でパイプが機能しませんでした。ソースがバッファに書き込む可能性があり、これによりカラーライザーとの同期が失われます。