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.