これは、すでに提示されたいくつかの優れたアイデアを組み合わせたソリューションです。
bash スクリプトで関数を作成します:
color() ( set -o pipefail; "[email protected]" 2>&1>&3 | sed $'s,.*,\e[31m&\e[m,' >&2 ) 3>&1
次のように使用します:
$ color command -program -args
コマンドの stderr
が表示されます 赤で。
それがどのように機能するかの説明については、読み続けてください。このコマンドには興味深い機能がいくつかあります。
color()...
— color という bash 関数を作成します。set -o pipefail
— これは、出力が別のコマンドにパイプされるコマンドのエラー リターン コードを保持するシェル オプションです。これは、外側のシェルで pipefail オプションを変更しないように、括弧で作成されたサブシェルで行われます。"[email protected]"
— 関数への引数を新しいコマンドとして実行します。"[email protected]"
"$1" "$2" ...
と同等です2>&1
—stderr
をリダイレクトします コマンドのstdout
へのsed
になるように のstdin
.>&3
—1>&3
の省略形 、これはstdout
をリダイレクトします 新しい一時ファイル記述子3
に .3
stdout
にルーティングされますsed ...
— 上記のリダイレクトのため、sed
のstdin
stderr
です 実行されたコマンドの。その機能は、各行をカラー コードで囲むことです。$'...'
バックスラッシュでエスケープされた文字を理解できるようにする bash 構造.*
— 行全体に一致します。\e[31m
— 次の文字を赤色にする ANSI エスケープ シーケンス&
—sed
一致した文字列全体 (この場合は行全体) に展開される文字を置き換えます。\e[m
— 色をリセットする ANSI エスケープ シーケンス>&2
—1>&2
の省略形 、これはsed
をリダイレクトします のstdout
stderr
へ .3>&1
— 一時ファイル記述子3
をリダイレクトしますstdout
に戻ります .
以下は、STDOUT をグリーンにする同じ概念の拡張です:
function stdred() (
set -o pipefail;
(
"[email protected]" 2>&1>&3 |
sed $'s,.*,\e[31m&\e[m,' >&2
) 3>&1 |
sed $'s,.*,\e[32m&\e[m,'
)
stderred もチェックできます:https://github.com/sickill/stderred
端末エミュレータでこれを行う方法があるとは思えません。
端末エミュレーターとシェル/アプリ間のインターフェイスは、端末エミュレーターがマスター側にあり、シェル/アプリが反対側にある疑似 tty 経由です。シェル/アプリは stdout と stderr の両方が同じ pty に接続されているため、ターミナル エミュレーターがシェル/アプリの出力を pty から読み取ると、どちらが stdout に書き込まれ、どれが stderr に書き込まれたかを判断できなくなります。
アプリケーションとスレーブ pty の間のデータをインターセプトし、エスケープ コードを挿入して端末出力 colo(u)r を制御するソリューションの 1 つを使用する必要があります。