ベストアンサー1
ターミナル上で標準エラーと標準出力を見たいと仮定します。次のようにします。ジョシュ・ケリーの回答ですが、tail
ログファイルを出力するバックグラウンドで を維持するのは、非常にハック的で不格好だと思います。ファイル記述子その後、それを強制終了してクリーンアップを実行します。技術的には、これを で実行する必要がありますtrap '...' EXIT
。
これを行うにはもっと良い方法があり、あなたはすでにそれを発見しています: tee
。
ただし、標準出力にのみ使用するのではなく、標準出力と標準エラーにそれぞれ 1 つずつ t を使用します。これをどのように実現しますか? プロセス置換とファイル リダイレクト:
command > >(tee -a stdout.log) 2> >(tee -a stderr.log >&2)
分けて説明してみましょう:
> >(..)
>(...)
(プロセス置換) は FIFO を作成し、tee
それを listen させます。次に、(ファイル リダイレクト) を使用して、最初のが listen しているFIFO に>
標準出力をリダイレクトします。command
tee
2番目も同様です:
2> >(tee -a stderr.log >&2)
プロセス置換を再度使用して、tee
標準入力から読み取り、それを にダンプするプロセスを作成しますstderr.log
。tee
は入力を標準出力に戻しますが、その入力は標準エラーなので、 の標準出力を再度標準エラーにリダイレクトする必要があります。次に、ファイル リダイレクトを使用して、の標準エラーを FIFO の入力 (の標準入力)にtee
リダイレクトします。command
tee
見る入出力
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"