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


9

私はbashを./fff使い始めたばかりですが、生涯、特定のコマンドを実行する方法を理解することはできません。標準エラー出力の前に、標準エラー出力をstderrの前に出力してください(自分自身の意味について混乱しています)。

例えば

$ 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

2
cat「a」を「some」で本当に置き換えましたか?
Dmitry Grigoryev

おっと、私は文字列をめちゃくちゃにしたかもしれません。私はすぐに編集します@DmitryGrigoryev
MeOw

回答:


18

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>して、独立して適用される)fffの標準出力パイプに行く、とspongeのSTDINがパイプの他方の端部です。
  • 2>&1fff(stderr)のfd 2は、1と同じことを指します:この時点でのパイプなので、fffエラーはspongeそのパイプ経由で発生します。
  • >&3:stdoutが元のstdoutを指すようになりました(元のstdoutにリダイレクトされます)
  • 3>&-fff不要なfd 2を閉じる
  • sponge入力を蓄積し、>&2そのstdinでeofが検出された後(fff終了時にstdoutにすべての出力がすでに書き込まれていると想定)、それを(stderrと同じリソースにリダイレクトされたstdoutに)表示するだけです。

spongeがインストールされていない場合は、に置き換えることができますperl -0777 -pe ''。を使用すると-pe ''perl入力から一度に1つのレコードを読み取り、stdoutに書き込みます。-0777(その場合は1つのみ)レコードが入力全体である丸呑みモードです。


お時間のある方は是非分解してください!
ジョージウドセン2018年

...のtee代わりに使用できspongeますか?
George Vasiliou

@GeorgeUdosen編集を参照してください。
ステファンChazelas

1
@GeorgeVasiliouはteeデータを保持せず、読み取りと同時に書き込みます。
ステファンChazelas

2
@MeOw:結構ですが、ステファンの答えの3行目が示すように、標準出力を保存する必要はありません。するだけcat foo nofile foo nofile foo 2> ferr.txt; cat ferr.txt。(そして、おそらく使用したくないでしょう>>。)また、Stéphaneはcat ferr.txt >&2、stderrにstderr情報書き込むために行うべき優れた点を示しています。
G-Manが 'Reinstate Monica'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.