3

Bash は色をサポートします。つまり\033[31m、赤に\033[0m切り替えて無色に戻ります。

stderr を確実に赤で出力する小さな bash-wrapper を作成したいと思います。つまり、stderr から来るすべてのもの\033[31mの前後に配置する必要があります。\033[0m

2 つの並列プロセス (または単一のプロセス) が stdout と stderr の両方に書き込む場合、文字ごとに 2 つを区別する方法が必要になるため、これが可能かどうかさえわかりません。

4

2 に答える 2

1

テキストの色付けは非常に簡単です。各行を読み、最初と最後に適切なエスケープシーケンスを付けてエコーします。ただし、標準エラーはパイプに渡されないため、標準エラーの色付けには注意が必要です。

これは、標準エラーと標準出力を交換してから、標準出力をフィルタリングすることで機能する1つのアプローチです。

テストコマンドは次のとおりです。

#!/bin/bash

echo hi
echo 'Error!' 1>&2

そしてwrapperスクリプト:

#!/bin/bash
(# swap stderr and stdout
 exec 3>&1 # copy stdout to fd 3
 exec 1>&2 # copy stderr to fd 1
 exec 2>&3- # move saved stdout on fd 3 over to 2
 "${@}") | while read line; do
                echo -e "\033[31m${line}\033[0m"
           done

それで:

$ ./wrapper ./test-command
hi
Error! # <- shows up red

残念ながら、wrapperコマンドからのすべての出力は、stderrではなくstdoutから出力されるため、出力をそれ以上のスクリプトにパイプすることはできません。一時的なFIFOを作成することで、おそらくこれを回避できます…しかし、うまくいけば、この小さなラッパースクリプトでニーズを満たすのに十分です。

于 2013-01-22T05:46:40.697 に答える
1

andrewdotn のラッパーに基づく

変更点:

  • stderr 出力を stderr に戻します
  • 行内echo -eのコンテンツを処理しない

ラッパー

#!/bin/bash

"${@}" 2> >(
while read line; do
    echo -ne "\033[31m" 1>&2
    echo -n "${line}" 1>&2
    echo -e "\033[0m" 1>&2
done
)

問題: 出力行は、stdout/stderr が混在するのではなく、最終的にグループ化されます。

テスト スクリプト:

#!/bin/bash

echo Hi
echo "\033[32mStuff"
echo message
echo error 1>&2
echo message
echo error 1>&2
echo message
echo error 1>&2

出力:

Hi
\033[32mStuff
message
message
message
error # <- shows up red
error # <- shows up red
error # <- shows up red
于 2015-07-09T18:54:57.187 に答える