パイプで「tee」を使用しながら標準エラーをファイルに書き込むにはどうすればいいですか? 質問する

パイプで「tee」を使用しながら標準エラーをファイルに書き込むにはどうすればいいですか? 質問する

tee出力を書き込むためにどのように使用するか知っています(標準出力) を にaaa.sh変更bbb.outし、ターミナルに表示します。

./aaa.sh | tee bbb.out

これからどう書くか標準誤差ccc.out表示されたまま、という名前のファイルに追加できますか?

ベストアンサー1

ターミナル上で標準エラーと標準出力を見たいと仮定します。次のようにします。ジョシュ・ケリーの回答ですが、tailログファイルを出力するバックグラウンドで を維持するのは、非常にハック的で不格好だと思います。ファイル記述子その後、それを強制終了してクリーンアップを実行します。技術的には、これを で実行する必要がありますtrap '...' EXIT

これを行うにはもっと良い方法があり、あなたはすでにそれを発見しています: tee

ただし、標準出力にのみ使用するのではなく、標準出力と標準エラーにそれぞれ 1 つずつ t を使用します。これをどのように実現しますか? プロセス置換とファイル リダイレクト:

command > >(tee -a stdout.log) 2> >(tee -a stderr.log >&2)

分けて説明してみましょう:

> >(..)

>(...)(プロセス置換) は FIFO を作成し、teeそれを listen させます。次に、(ファイル リダイレクト) を使用して、最初のが listen しているFIFO に>標準出力をリダイレクトします。commandtee

2番目も同様です:

2> >(tee -a stderr.log >&2)

プロセス置換を再度使用して、tee標準入力から読み取り、それを にダンプするプロセスを作成しますstderr.logteeは入力を標準出力に戻しますが、その入力は標準エラーなので、 の標準出力を再度標準エラーにリダイレクトする必要があります。次に、ファイル リダイレクトを使用して、の標準エラーを FIFO の入力 (の標準入力)にteeリダイレクトします。commandtee

見る入出力

shプロセス置換は、POSIX や Bourneではなく、シェルとして Bash を選択した場合に得られるボーナスとして本当に素晴らしい機能の 1 つです。


ではsh、手動で作業を行う必要があります。

out="${TMPDIR:-/tmp}/out.$$" err="${TMPDIR:-/tmp}/err.$$"
mkfifo "$out" "$err"
trap 'rm "$out" "$err"' EXIT
tee -a stdout.log < "$out" &
tee -a stderr.log < "$err" >&2 &
command >"$out" 2>"$err"

おすすめ記事