Se voglio creare il contenuto di file2 corrisponde al contenuto di file1 , ovviamente potrei semplicemente eseguire cp file1 file2 .
Tuttavia, se voglio preservare tutto su file2 tranne i contenuti—proprietario, autorizzazioni, attributi estesi, ACL, hard link, ecc., ecc., quindi non vorrei eseguire cp .* In tal caso voglio solo eseguire il plop del contenuto di file1 in file2 .
Sembra che lo farebbe quanto segue:
< file1 > file2
Ma non funziona. file2 viene troncato a nulla e non viene scritto. Tuttavia,
cat < file1 > file2
fa lavoro.
Mi ha sorpreso che la prima versione non funzionasse.
La seconda versione è un UUOC? C'è un modo per farlo senza invocare un comando, semplicemente usando i reindirizzamenti?
Nota:sono consapevole che UUOC è più un punto pedante che un vero anti-modello.
*Come scoperto da tniles09, cp farà in effetti funzionano in questo caso.
Risposta accettata:
cat < file1 > file2 non è un UUOC. Classicamente, < e > eseguire reindirizzamenti che corrispondono a duplicazioni di descrittori di file a livello di sistema.
Le duplicazioni di descrittori di file da sole non fanno nulla (beh, > reindirizzamenti aperti con O_TRUNC , quindi per essere precisi, i reindirizzamenti di output troncano il file di output). Non lasciare che il < > i simboli ti confondono. I reindirizzamenti non spostano i dati:assegnano descrittori di file ad altri descrittori di file.
In questo caso apri file1 e assegna quel descrittore di file al descrittore di file (<file1 ==0<file1 ) e file2 e assegna quel descrittore di file al descrittore di file 1 (>file2 ==1>file2 ).
Ora che hai due descrittori di file, hai bisogno di un processo per spalare i dati tra i due, ed è quello che cat è per.