
入力すると
cat some_file > new_file1 > new_file2
some_file
innew_file2
と emptyから出力を取得しましたnew_file1
。
その内部ロジックは何ですか? 具体的には、stdout
of ファイルとは何ですか?
注: 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 を参照してください。file1
file2
man zshmisc
これを の外部で実現するにはzsh
、 を使用するだけですtee
。echo derp | tee file1 file2 > /dev/null
は zsh の と同等ですecho derp >file1 >file2
。