もっと簡単に。これは、最初は 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」コマンドを呼び出します。