3

bash スクリプト (freebsd6) でコマンドを実行する必要があり、コマンドの stderr と stdout の両方をコンソール、ログ ファイル、および bash 変数に送信する必要があります。

したがって、リダイレクトなしで、私が望むのは次のとおりです。

result=`./command | tee output.log`

これをそのまま実行すると、stderr だけがコンソールに出力され、stdout だけが output.log ファイルと $result 変数の両方に出力されます。その理由は理解できますが、さまざまなリダイレクトを何度も試みた結果、両方のストリームを 3 つの場所すべてに送信できませんでした。

stderr と stdout の両方を 3 つの場所すべてに送信するにはどうすればよいですか?

4

1 に答える 1

5
result=`./command 2>&1 | tee output.log | tee /dev/tty`

[編集]

nm がコメントで指摘しているように、tee複数の引数を受け入れます。

result=`./command 2>&1 | tee output.log /dev/tty`

[2回目の編集]

コメントで Chris からアイデアを借りて、これを実行して出力を stderr に送信することもできます。

result=`./command 2>&1 | tee /tmp/foo.log >(cat 1>&2)`

あなたが望むことを正確に行うために、私が見つけた最高のものはこれです:

exec 3>&1 ; result=`./command 2>&1 | tee /tmp/foo.log >(cat 1>&3)` ; exec 1>&3

(ここでの全体的な問題は、内部の何かが実行される前にバッククォートが stdout をリダイレクトすることです。したがって、この行は古い stdout を記述子 3 として保存および復元します。これは良い考えである場合とそうでない場合があります...)

于 2011-07-25T15:32:00.413 に答える