tl; dr
No. >>
ist im Wesentlichen "immer bis zum Ende der Datei suchen", während >
ein Zeiger auf den zuletzt geschriebenen Ort bleibt .
Volle Antwort
(Hinweis: Alle meine Tests wurden unter Debian GNU / Linux 9 durchgeführt).
Ein weiterer Unterschied
Nein, sie sind nicht gleichwertig. Es gibt noch einen anderen Unterschied. Es kann sich selbst manifestieren, unabhängig davon, ob die Zieldatei zuvor existiert hat oder nicht.
Um dies zu beobachten, führen Sie einen Prozess aus, der Daten generiert und mit >
oder >>
(z pv -L 10k /dev/urandom > blob
. B. ) zu einer Datei umleitet . Lassen Sie es laufen und ändern Sie die Größe der Datei (zB mit truncate
). Sie werden sehen, dass >
der (wachsende) Offset >>
beibehalten wird, während er immer an das Ende angehängt wird.
- Wenn Sie die Datei auf eine kleinere Größe kürzen (kann Null sein)
>
Es ist mir egal, es schreibt am gewünschten Offset, als wäre nichts passiert; Unmittelbar nach dem Abschneiden des Versatzes über das Ende der Datei hinaus wird die Datei ihre alte Größe wiedererlangen und weiter wachsen. Die fehlenden Daten werden mit Nullen aufgefüllt (wenn möglich sparsam).>>
Wird an das neue Ende angehängt, wächst die Datei von ihrer abgeschnittenen Größe.
- Wenn Sie die Datei vergrößern
>
Es ist mir egal, es schreibt am gewünschten Offset, als wäre nichts passiert; Unmittelbar nach dem Ändern der Größe befindet sich der Versatz irgendwo in der Datei. Dies führt dazu, dass die Datei für eine Weile nicht mehr wächst, bis der Versatz das neue Ende erreicht. Dann wird die Datei normal groß.>>
wird an das neue Ende angehängt, die Datei wird größer und größer.
Ein anderes Beispiel ist das Hinzufügen (mit einem separaten >>
) etwas Extra, wenn der Datenerzeugungsprozess ausgeführt wird und in die Datei geschrieben wird. Dies ähnelt dem Vergrößern der Datei.
- Der Erzeugungsprozess mit
>
wird an seinem gewünschten Offset schreiben und die zusätzlichen Daten eventuell überschreiben. - Der Generierungsprozess mit
>>
überspringt die neuen Daten und hängt an diesen an (die Race-Bedingung kann auftreten, die beiden Streams können verschachtelt sein, dennoch sollten keine Daten überschrieben werden).
Beispiel
Ist es in der Praxis wichtig? Es gibt diese Frage :
Ich führe einen Prozess aus, der auf stdout viel ausgibt. Alles in eine Datei senden [...] Kann ich ein Protokoll-Rotationsprogramm verwenden?
Diese Antwort sagt die Lösung logrotate
mit copytruncate
Option, die wie folgt wirkt:
Kürzen Sie die ursprüngliche Protokolldatei an Ort und Stelle, nachdem Sie eine Kopie erstellt haben, anstatt die alte Protokolldatei zu verschieben und optional eine neue zu erstellen.
Nach dem, was ich oben geschrieben habe, >
wird das abgeschnittene Protokoll durch das Umleiten mit innerhalb kürzester Zeit groß. Sparsamkeit spart den Tag, es sollte kein nennenswerter Speicherplatz verschwendet werden. Dennoch enthält jedes aufeinanderfolgende Protokoll mehr und mehr führende Nullen, die völlig unnötig sind.
Wenn jedoch logrotate
Kopien erstellt werden, ohne die Spärlichkeit zu erhalten, benötigen diese führenden Nullen bei jeder Kopie mehr und mehr Speicherplatz. Ich habe das Werkzeugverhalten nicht untersucht. Es kann klug genug sein, wenn die Komprimierung im Verlauf der Zeit geringer ist (wenn die Komprimierung aktiviert ist). Dennoch können die Nullen nur Probleme verursachen oder bestenfalls neutral sein; nichts Gutes in ihnen.
In diesem Fall ist die Verwendung >>
statt statt >
wesentlich besser, auch wenn die Zieldatei gerade erstellt wird.
Performance
Wie wir sehen, verhalten sich die beiden Operatoren nicht nur zu Beginn, sondern auch später. Dies kann zu geringfügigen (geringfügigen) Leistungsunterschieden führen. Zur Zeit habe ich keine aussagekräftigen Testergebnisse, die es unterstützen oder widerlegen könnten, aber ich denke, Sie sollten nicht automatisch davon ausgehen, dass ihre Leistung im Allgemeinen die gleiche ist.