複数ファイルへのコマンドのリダイレクト: コマンド >file1 >file2

複数ファイルへのコマンドのリダイレクト: コマンド >file1 >file2

私は次のコマンドを持っています:

cat somefile >file1 >file2

file1このコマンドを実行した後、なぜ何もないのは理解できません。最初のファイル()の出力が必要ですsomefileが、その中には何もありません。

私の出力をコピーしたり書いたりしない理由を説明してくださいsomefile。 (file2私の出力は含まれていますが、file1何も含まれていません)

ベストアンサー1

シェルリダイレクトがうまくいくと思う方法と実際に動作する方法には違いがあると思います。

zsh出力が複数回リダイレクトされたときに表示されるのと同様の動作を実装する場合を除き、teeシェルの出力を複数回リダイレクトすることはできず、指定したすべての場所にリダイレクトされると期待できません。代わりに、最後の場所にのみリダイレクトされますfile2。あなたの場合、Chaosの答えはI / Oリダイレクトがどのように機能するかについて良い説明を提供します。

あなたが本当にやりたいことは:

$ cat example.txt | tee file1 > file2

tee標準入力から読み込み、複数のファイル記述子に書き込むプログラムです。その一つはいつも標準出力。したがって、我々はを使用してtee出力を作成し、file1標準出力をfile2

また、コメントで提案されているように、目的を達成するためのより良い方法は次のとおりです。

$ tee file1 < example.txt > file2

このアプローチの利点は、stdinパイプを通して読み取ろうとする代わりにリダイレクトされることです。これは、シェルが1つのプロセスを生成しなくてはならないことを意味します。いわゆる「猫のごみの利用」も解消されます。配置して出力リダイレクト後ろに入力リダイレクトを使用すると、入力ファイルを開くことができない場合に出力ファイルが破損するのを防ぎます。

おすすめ記事