私はファイルにリダイレクトし、ティーを使用する方法を知っています。基本的なレベルで。そう
$ alias outanderr='bash -c "echo stdout >&1; echo stderr >&2"'
# A fake "application" displaying both output and error messages.
$ outanderr 1>file # redirect stdout to a file, display stderr
stderr
$ outanderr 2>file # redirect stderr to a file, display stdout
stdout
$ outanderr 1>file 2>&1 # redirect both to a file, display nothing
$ outanderr | tee file; echo "-- file contents --" && cat file
# redirect stdout to a file, display both (note: order is messed up)
stderr
stdout
-- file contents --
stdout
$ outanderr 2>&1 | tee file; echo "-- file contents --" && cat file
# redirect both to a file, display both
stdout
stderr
-- file contents --
stdout
stderr
質問は、以下の出力を取得するために疑問符の代わりに何を書くかです:
$ outanderr ???; echo "-- file contents --" && cat file
# redirect both to a file, display stderr
stderr
-- file contents --
stdout
stderr
制約:
2>&1 >>outputfile | tee --append outputfile
簡単なテスト:
echo -n >outputfile; bash -c "echo stdout >&1; echo stderr >&2" 2>&1 >>outputfile |
tee --append outputfile; echo "outputfile:"; cat outputfile
編集1:
これは、stdout(のみ)をファイルに書き込み、それがパイプを通過するようにsterr stdoutを作成し、teeにその出力を同じファイルに書き込むことによって機能します。
両方の書き込みは追加モード(>>
ではなく>
)で行う必要があります。そうしないと、両方の出力がお互いに上書きされます。
パイプはバッファであるため、出力が正しい順序でファイルに表示される保証はありません。アプリケーションが両方のファイル記述子(2つのパイプ)に接続されていても、これは変更されません。保証された順序では、両方の出力が同じチャネルを通過し、それぞれにマークを付ける必要があります。または、あなたはいくつかの本当に豪華なものを必要とするでしょう:
/dev/null
に送信できます。アプリケーションの出力は、strace -f -s 32000 -e trace=write
を介して実行することにより分離されます。その場合、エスケープを元に戻す必要があります。言うまでもないことですが、トレースすることでアプリケーションの実行が速くなることはありません。