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

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

これは、すでに提示されたいくつかの優れたアイデアを組み合わせたソリューションです。

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>&1stderr をリダイレクトします コマンドの stdout への sed になるように の stdin .
  • >&31>&3 の省略形 、これは stdout をリダイレクトします 新しい一時ファイル記述子 3 に . 3 stdout にルーティングされます
  • sed ... — 上記のリダイレクトのため、sedstdin stderr です 実行されたコマンドの。その機能は、各行をカラー コードで囲むことです。
  • $'...' バックスラッシュでエスケープされた文字を理解できるようにする bash 構造
  • .* — 行全体に一致します。
  • \e[31m — 次の文字を赤色にする ANSI エスケープ シーケンス
  • &sed 一致した文字列全体 (この場合は行全体) に展開される文字を置き換えます。
  • \e[m — 色をリセットする ANSI エスケープ シーケンス
  • >&21>&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 つを使用する必要があります。


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

  2. stdout と stderr の両方にエコーする

  3. stdout と stderr でバッファリングを無効にしても安全ですか?

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

  2. StdoutとStdinを接続することの意味は何ですか?

  3. teeを使用してSTDERRおよびSTDOUTをファイルにキャプチャする

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

  2. (ターミナルベースの)Vimでメニューを作成して使用することは可能ですか?

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