テストの目的で、stdoutとstderr を個別にに保存して検査します。たとえば、誤った入力でテストを実行するとstderrに出力されますが、stdoutには出力されません。正しい入力でテストを実行するとstdoutに出力されますが、stderrには出力されません。テストで競合状態を避けるためには、保存は同期している必要があります(私はprocess substitutionを使用できません)。stdout、stderr、stdout + stderrを同期して保存します
事実の後にテストをデバッグできるようにするために、私はも出力された順番でstdoutとstderrを参照する必要があります。だから私はそれらを同じファイル/変数/に保存するか、別々に保存するのと同時にそれらを端末に送信する必要があります。
エラーが発生したことをテストするには、にコマンドの終了コードが必要です。
効率と正確さの理由から、私はもちろん各テストを2回実行することはできません。
例えばstdoutをstdout.logに、stderrをstderr.logに、との両方に同じコマンドでoutput.logにリダイレクトすることは可能ですか?または、同期tee
コマンドをstdoutとstderrに別々に使用するには?または、stdoutとstderrのコピーを別々の変数に保存するには?
更新:ティムのソリューションは、ほとんどの作品のようにそれは(all.logする代わりに、ログの端子に出力に変更された)になります。
$ set -o pipefail
$ {
{
echo foo | tee stdout.log 2>&3 3>&-
} 2>&1 >&4 4>&- | tee stderr.log 2>&3 3>&-
} 3>&2 4>&1
foo
$ cat stdout.log
foo
$ cat stderr.log
$ {
{
echo foo >&2 | tee stdout.log 2>&3 3>&-
} 2>&1 >&4 4>&- | tee stderr.log 2>&3 3>&-
} 3>&2 4>&1
foo
$ cat stdout.log
$ cat stderr.log
foo
$ bar=$({
{
echo foo | tee stdout.log 2>&3 3>&-
} 2>&1 >&4 4>&- | tee stderr.log 2>&3 3>&-
} 3>&2 4>&1)
$ echo "$bar"
foo
$ cat stdout.log
foo
$ cat stderr.log
$ bar=$({
{
echo foo >&2 | tee stdout.log 2>&3 3>&-
} 2>&1 >&4 4>&- | tee stderr.log 2>&3 3>&-
} 3>&2 4>&1)
$ cat stdout.log
$ cat stderr.log
foo
$ echo "$bar"
foo
これが最後の反復値を除い動作しているようですbar
の値はstderrの内容に設定されます。これらのすべてがうまくいくという提案はありますか?
我々はラインベースの文字列を話していると仮定すると、我々はパイプでは '、たとえば、sed'を通じストリームの両方が可能行の先頭にマーカーを追加するには?次に、ログファイルからどの行がどのストリームから来ているかを知ることができます。 – Raphael
@Raphael:各プロセス置換の中で 'tee'の前に置くことができるはずです。' exec>>(sed 's/^/from STDOUT:/' | tee -a mylog)2>>(sed 's/^ /からSTDERR:/ '| tee -a mylog>&2) '(テストされていません)。これは、端末への出力にも、それらのプレフィックスをもたせることになります。 –
クール!あなたが与える見積もりの一部を無効にしませんか?今私たちはsychronized共有出力ファイルを持っていますが、どちらが何か、または私は何かが不足しているかを知っている? – Raphael