
私は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
またはメモリ(ここではsponge
fromが使用されています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
stdoutはパイプに入り、sponge
stdinはパイプのもう一方の端です。2>&1
fd 2 of:(stderr)はfff
この時点で1:のパイプと同じものを指すので、fff
エラーはsponge
そのパイプを通過します。>&3
:stdoutは元のstdoutを指します(元の場所にリダイレクトされます)。3>&-
fff
:不要なfd 3を閉じます。sponge
>&2
入力を蓄積し、stdinでeofが検出された後にのみ表示します(終了し、fff
すべての出力がstderrと同じリソースにリダイレクトされたstdoutに書き込まれたとします)。
インストールされていない場合は、sponge
1つに交換できますperl -0777 -pe ''
。を使用すると、-pe ''
入力perl
から一度に1つのレコードを読み取り、それを標準出力に書き込みます。-0777
フルルックモードです。ここで(この場合は1つしかありません)、レコードは完全な入力です。