あるファイルを別のファイルにリダイレクトするのはUUOCですか(無駄なcatを使用)?

あるファイルを別のファイルにリダイレクトするのはUUOCですか(無駄なcatを使用)?

私が望むものfile2の内容と一致すれば、file1明らかに実行できますcp file1 file2

しかし、私が守りたいならすべて~についてfile2 とは別にコンテンツ - 所有者、権限、拡張属性、ACL、ハードリンクなどを実行したくありません。cp*この場合は。file1file2

次はこのトリックを実行するようです。

< file1 > file2

しかし、これはうまくいきません。 file2null に切り捨てられ、記録されません。しかし、

cat < file1 > file2

する働く

驚いたことに、最初のバージョンは動作しませんでした。

2番目のバージョンはUUOCですか?リダイレクトを使用してコマンドを呼び出さずにこれを行う方法はありますか?

注:私はUUOCが実際のアンチパターンではなく、賢明な意見に近いことを知っています。

*ようにtniles09発見cp 〜するこの場合は実際に動作します。

ベストアンサー1

cat < file1 > file2UUOCではありません。通常、システムレベルのファイル記述子の複製に対応するリダイレクトが<行われます。>ファイル記述子の複製自体は何もしません(まあ、>リダイレクトはopenを使用するので、O_TRUNC正確に言えば、出力リダイレクトは出力ファイルを切り捨てます)。この< >記号を混同しないでください。リダイレクトはデータを移動しませんが、ファイル記述子を別のファイル記述子に割り当てます。

この場合、file1対応するファイル記述子を開き、それをファイル記述子0<file1== 0<file1)に割り当て、次にfile2そのファイル記述子をファイル記述子1>file2== 1>file2)に割り当てます。

2 つのファイル記述子があるので、2 つのファイル記述子間でデータを移動するプロセスが必要です。これがまさに目的ですcat

おすすめ記事