私が望むものfile2
の内容と一致すれば、file1
明らかに実行できますcp file1 file2
。
しかし、私が守りたいならすべて~についてfile2
とは別にコンテンツ - 所有者、権限、拡張属性、ACL、ハードリンクなどを実行したくありません。cp
*この場合は。file1
file2
次はこのトリックを実行するようです。
< file1 > file2
しかし、これはうまくいきません。 file2
null に切り捨てられ、記録されません。しかし、
cat < file1 > file2
する働く
驚いたことに、最初のバージョンは動作しませんでした。
2番目のバージョンはUUOCですか?リダイレクトを使用してコマンドを呼び出さずにこれを行う方法はありますか?
注:私はUUOCが実際のアンチパターンではなく、賢明な意見に近いことを知っています。
*ようにtniles09発見、cp
〜するこの場合は実際に動作します。
ベストアンサー1
cat < file1 > file2
UUOCではありません。通常、システムレベルのファイル記述子の複製に対応するリダイレクトが<
行われます。>
ファイル記述子の複製自体は何もしません(まあ、>
リダイレクトはopenを使用するので、O_TRUNC
正確に言えば、出力リダイレクトは出力ファイルを切り捨てます)。この<
>
記号を混同しないでください。リダイレクトはデータを移動しませんが、ファイル記述子を別のファイル記述子に割り当てます。
この場合、file1
対応するファイル記述子を開き、それをファイル記述子0
(<file1
== 0<file1
)に割り当て、次にfile2
そのファイル記述子をファイル記述子1
(>file2
== 1>file2
)に割り当てます。
2 つのファイル記述子があるので、2 つのファイル記述子間でデータを移動するプロセスが必要です。これがまさに目的ですcat
。