Wenn ich den Inhalt von file2 machen möchte mit dem Inhalt von file1 übereinstimmen , könnte ich natürlich einfach cp file1 file2 ausführen .
Wenn ich jedoch alles erhalten möchte über file2 außer den Inhalt – Eigentümer, Berechtigungen, erweiterte Attribute, ACLs, feste Links usw. usw., dann würde ich cp nicht ausführen wollen .* In diesem Fall möchte ich nur den Inhalt von file1 ploppen in file2 .
Es sieht so aus, als würde Folgendes funktionieren:
< file1 > file2
Aber es funktioniert nicht. file2 auf nichts gekürzt und nicht geschrieben. Allerdings
cat < file1 > file2
macht Arbeit.
Es hat mich überrascht, dass die erste Version nicht funktioniert.
Ist die zweite Version ein UUOC? Gibt es eine Möglichkeit, dies zu tun, ohne einen Befehl aufzurufen, indem Sie einfach Umleitungen verwenden?
Hinweis:Mir ist bewusst, dass UUOC eher ein pedantischer Punkt als ein echtes Anti-Pattern ist.
*Wie tniles09 festgestellt hat, cp wird in diesem Fall tatsächlich funktionieren.
Akzeptierte Antwort:
cat < file1 > file2 ist kein UUOC. Klassischerweise < und > führen Umleitungen durch, die Dateideskriptor-Duplizierungen auf Systemebene entsprechen.
Dateideskriptor-Duplizierungen an sich bewirken nichts (na ja, > Umleitungen werden mit O_TRUNC geöffnet , um genau zu sein, kürzen Ausgabeumleitungen die Ausgabedatei). Lassen Sie nicht den < > Symbole verwirren Sie. Umleitungen verschieben keine Daten – sie weisen Dateideskriptoren anderen Dateideskriptoren zu.
In diesem Fall öffnen Sie file1 und weisen Sie diesen Dateideskriptor dem Dateideskriptor zu (<file1 ==0<file1 ) und file2 und weisen Sie diesen Dateideskriptor dem Dateideskriptor 1 zu (>file2 ==1>file2 ).
Jetzt, da Sie zwei Dateideskriptoren haben, brauchen Sie einen Prozess, um Daten zwischen den beiden zu schaufeln – und das ist cat ist für.