私はそれを使用していますストライディッドstderr 赤色に流れるすべての出力をカラー化します。よく走っています。しかし、私自身のbashスクリプトを書いてエラーが発生すると、echo 'error' 1>&2
出力は赤く表示されません。これは、コマンドが単に出力をstderrファイル記述子が指す場所にリダイレクトしますが、メッセージをstderrに属するものとして正しく表示しないためだと思います。そうですか? Bashでstderrに正しく書き込む方法は?
答え1
プログラムは、ファイル記述子2に印刷しているかどうかを検出するためにさまざまなwrite()関数をオーバーライドし、関連するエスケープコードを追加してターミナル出力を赤にするようです。
残念ながら、シェルで次のことを行うと
echo "foo" 1>&2
関数はまだファイル記述子1に対して書き込み(または他の同様のシステムコール)を呼び出します。ファイル記述子 1 がシェルによってファイル記述子 2 にコピーされたため、出力は fd 2 に表示されます。
残念ながら、シェルでfd 2に/directly/を書き込む方法がわかりませんが、awkを使用できます。このような関数は、引数をファイル記述子2に直接書き込みます。
error() {
awk " BEGIN { print \"$@\" > \"/dev/fd/2\" }"
}
私はこれがPOSIXの一部ではないGNU awkの機能だと思います。ただし、OS Xでも利用可能なawkでも動作します。
答え2
ソフトウェアフックwrite()
はファイル記述子2(stderr
。
共有ライブラリなので、カーネルを再コンパイルする必要はありません。インストールマニュアルに記載されているように環境変数を使用してくださいLD_PRELOAD
。動的リンカーは、プログラムの実行中に動作を変更できます。これらの変数は、代替の場所から共有ライブラリを検索して、ランタイム接続プロセスを調整します。
実行可能ファイル/bin/bash
自体はこれらの変数をサポートしていないため、bash
変更されたパレットではなくシステムコールの元のパレットを使用します。あなたの質問で言及したリダイレクトはbash
。 bashを介さずにエラー記述子を直接作成できる場合、出力は赤になりますecho
。echo
Pythonはを書くことができますstderr
。証明を参照してください(赤で表示する必要があります):
python -c 'import os; os.write(2, "error")'
答え3
ヘルパー関数を作成します。
echoerr() { printf "\033[0;31m%s\n\033[0m" "$*" >&2; }
どこでも使用できます。
echoerr "something went wrong here"
これはstderr(>&2
)への書き込みと色の変更を組み合わせます(ここから取得したソリューション)。https://stackoverflow.com/questions/5947742/how-to-change-the-output-color-of-echo-in-linux)。
答え4
指示に従ってhttps://github.com/sickill/stderredスクリプトに追加する必要があります。
export LD_PRELOAD="/path/to/stderred/\$LIB/libstderred.so${LD_PRELOAD:+:$LD_PRELOAD}"
$LIB
アーキテクチャで手動で交換する必要があるかもしれません。