STDERRの前にSTDOUTを表示しますか?

STDERRの前にSTDOUTを表示しますか?

私はbashに最初に触れ、stderrの前に通常のstdoutを仮定し、印刷する特定のコマンドを実行する方法を生涯把握することはできません。./fff(自分の意味が混乱しています。)

例えば

$ printf "I am a\ndrill\n" > fff; 
$ cat fff nofile fff nofile fff

I am a
drill
cat: nofile: No such file or directory
I am a
drill
cat: nofile: No such file or directory
I am a
drill

次のように印刷する必要があります。

I am a
drill
I am a
drill
I am a
drill
cat: nofile: No such file or directory
cat: nofile: No such file or directory

まず、出力をファイルにリダイレクトしてから、同じファイルにエラーを追加する必要があることを知っていますが、これが私が得る出力です。

$ cat ./foo nofile ./foo nofile ./foo <<< $(touch fin) > see 2>> see 

I am a
drill
I am a
drill
I am a
drill
ectory
cat: nofile: No such file or directory

ベストアンサー1

あなたはする必要があります捕まえるとにかく、stderr出力は最後にそれを表示します。

文書私は考えた:

fff 2> file; cat file >&2

またはメモリ(ここではspongefromが使用されていますmoreutils):

{ fff 2>&1 >&3 3>&- | sponge >&2 3>&-; } 3>&1
  • {...} 3>&1{...}ファイル記述子(fd)内の3つのポイントを指します。オリジナルstdout(それで私たちはそれを使ってstdoutを復元できますfff)。
  • fff <redirs> | sponge <redirs>fff同時にsponge<redirs>スタンドアロンアプリケーション)fffstdoutはパイプに入り、spongestdinはパイプのもう一方の端です。
  • 2>&1fd 2 of:(stderr)はfffこの時点で1:のパイプと同じものを指すので、fffエラーはspongeそのパイプを通過します。
  • >&3:stdoutは元のstdoutを指します(元の場所にリダイレクトされます)。
  • 3>&-fff:不要なfd 3を閉じます。
  • sponge>&2入力を蓄積し、stdinでeofが検出された後にのみ表示します(終了し、fffすべての出力がstderrと同じリソースにリダイレクトされたstdoutに書き込まれたとします)。

インストールされていない場合は、sponge1つに交換できますperl -0777 -pe ''。を使用すると、-pe ''入力perlから一度に1つのレコードを読み取り、それを標準出力に書き込みます。-0777フルルックモードです。ここで(この場合は1つしかありません)、レコードは完全な入力です。

おすすめ記事