連鎖リダイレクトの内部ロジック

連鎖リダイレクトの内部ロジック

入力すると

cat some_file > new_file1 > new_file2

some_fileinnew_file2と emptyから出力を取得しましたnew_file1

その内部ロジックは何ですか? 具体的には、stdoutof ファイルとは何ですか?

注: Windows では中間のファイルはスキップされます。

答え1

それはシェルによって異なります。

bash では、echo derp >file1 >file2まず を開いてfile1切り詰め、次にstdoutの がecho derpに書き込まれるように調整しますfile1。次に、bash は に対して同じことを行います。つまり、file2を開いてfile2切り詰め、代わりにstdoutの がecho derpに書き込まれるように調整しますfile2

最終的な効果は、 がfile1切り捨てられ (つまり、コンテンツが削除され)、stdoutにのみ入ることfile2です。連鎖は行われません。Bash は、stdout を一度に 1 つの場所にのみリダイレクトできます。これはパイプにも当てはまります。つまり、echo derp > file | cat"derp" の結果はパイプではなくファイルに書き込まれます。

ただし、zsh では、直感的に予想されるとおり、 はとecho derp >file1 >file2の両方に書き込みます。zshを使用する場合は、詳細については の MULTIOS を参照してください。file1file2man zshmisc

これを の外部で実現するにはzsh、 を使用するだけですteeecho derp | tee file1 file2 > /dev/nullは zsh の と同等ですecho derp >file1 >file2

関連情報