出力とエラーストリームを同じファイルに書き込む

出力とエラーストリームを同じファイルに書き込む

Unix / Linuxでは、パイプを使用して出力とエラーストリームをファイルに書き込むことができます。同じファイルに書き込むこともできます。どちらもファイルに書き込みながら順序を維持する方法はありますか?この声明は:

swipl -s jobshop.chr < CHRInput > output 2> output

出力ストリームとエラーストリームを含む「output」というファイルが実際に生成されます(通常、これはユーザーとコンソールの対話です)。ただし、出力ストリームはエラーストリームの前に書き込まれます(対話型コンソールを使用するとエラーと出力ストリームがインターリーブされます)。

答え1

バッシュの場合、

swipl -s jobshop.chr < CHRInput &> output

答え2

swipl -s jobshop.chr < CHRInput > output 2>&1

2>&1「ファイルディスクリプタ2(標準エラー)をリンクファイルディスクリプタ1(標準出力)にリダイレクトします」を意味します。これは2>&1標準出力リダイレクトの後に実行する必要があります。2>&1 >outputまず、fd 2を当時接続されたfd 1(つまり端末)に送信し、次にfd 1を端末にリダイレクトします。

プログラムの作成方法によっては、端末で実行するときと同じ順序で出力をインターリーブしないことがあります。プログラムがたくさんあるからバッファー標準出力に出力します。つまり、バッファがいっぱいになったときだけ実際にデータを書き込みます。ただし、標準出力が端子に接続されるとラインバッファリングされます。つまり、バッファがいっぱいになっていなくても、すべての行が書き込まれます。 (一方、Stderrはデフォルトではバッファリングされません。)したがって、プログラムがバッファをフラッシュしたり、デフォルト値を変更したりしても、ライン全体を書き込んでstderrに書き込むか、stderrに書き込むかを問わず、順番に書きたい場合はstderr出力、ファイルへのリダイレクトが機能しない可能性があります。

かなり新しいLinuxシステムでリダイレクトされた出力行の順序が間違っている場合は、次のようにします。

stdbuf -oL -oL swipl -s jobshop.chr <CHRInput >output 2>&1

関連情報