0

スクリプトの stdout と stderr をファイルにリダイレクトしながら、スクリプトの stderr を stdout に送信するにはどうすればよいでしょうか。

説明する:

テストスクリプト:

#!/bin/bash
echo "this goes to stdout"
echo "this goes to stderr" >&2

これをコンソールに出力するような方法で testscript を実行します。

this goes to stderr

これはログファイルに保存されます:

this goes to stdout
this goes to stderr

を使用して近づいたような気がしfifoますが、そこに到達したことはありません。必要なのはteefor stderr です。アイデア?

4

4 に答える 4

0

もっと簡単に。これは、最初は bashizm 内部フォーク、テスト スクリプトに基づいています。

#!/bin/bash
for i in {1..1000}; do
    echo STDOUT $i>&1
    echo STDERR $i>&2
done

次に、スクリプトのリダイレクト:

(./xxtext.sh 1>>logfile)2>&1|\ #subprocess/fork in brackets with redir stdout to logfile.
#above, main process redirect stderr to stdout for properly pipe
while read x; do echo $x; echo $x>>logfile; done #second read sequently stdin
#redirected from stderr, and both print to the screen and append to logfile.

残念ながら、これはシーケンスを適切に保存しません。これは、2 つのストリームがパイプ バッファリングを使用する 2 つの異なるプロセスによって管理されるためです。

本当にシーケンスを保存したい場合は、'select' システム コールを使用して、内部で開いているスクリプトから stdout と stderr の両方を読み取るしかありません。私はbashがこれをサポートしていないと信じています。これは、C、Perl、またはその他のより高度な言語で行うことができます。私が見つけたperlの便利な例:http://www.perlmonks.org/bare/?node_id=419919 これは「bc」コマンドを呼び出します。

于 2013-08-22T11:53:37.303 に答える
0

あなたはこのようなことを試すかもしれません

./script 2>&1 1>log | tee -a log

stdout はログインするために送信され1>log、tee はそれを stdout とログに送信するジョブを実行します。

PS: どういうわけか、この方法には嫌な予感がします。そう感じたらコメントください。

于 2013-07-25T21:39:00.963 に答える
0

現在回答に取り組んでいる人々にとっては本当に公平ではないと思いますが、私はそれを手に入れたと思います:

if [ ! -e /tmp/deployed.err ]
then
  mkfifo /tmp/deployed.err
fi

tee -a testlog </tmp/deployed.err &

./testscript 2>/tmp/deployed.err 1>>testlog

動作しているように見えますが、ログのメッセージが乱れるのではないかと心配しています。誰でも良いアイデアがありますか?

于 2013-07-25T21:26:42.657 に答える