私は次のコマンドを持っています:
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つのプロセスを生成しなくてはならないことを意味します。いわゆる「猫のごみの利用」も解消されます。配置して出力リダイレクト後ろに入力リダイレクトを使用すると、入力ファイルを開くことができない場合に出力ファイルが破損するのを防ぎます。