Was ist der Unterschied zwischen ">" und ">>" im Shell-Befehl?


Antworten:


48

>wird zum Überschreiben (" Clobbern ") einer Datei und >>zum Anhängen an eine Datei verwendet.

Wenn Sie also verwenden ps aux > file, wird die Ausgabe von ps auxin fileeine filebereits vorhandene Datei geschrieben, und der Inhalt dieser Datei wird überschrieben.

Und wenn Sie verwenden ps aux >> file, wird die Ausgabe von ps auxin filedie Datei geschrieben, und wenn die genannte Datei filebereits vorhanden war, enthält die Datei jetzt ihren vorherigen Inhalt und auch den Inhalt von ps aux, der nach dem älteren Inhalt von geschrieben wurde file.


11

wenn Sie im Terminal schreiben

ps aux > log

Es wird die Ausgabe der ps auxbenannten Datei protokollieren.

dann, wenn Sie setzen

ps aux >> log

dann wird die nächste Ausgabe unterhalb der ersten angefügt. Wenn Sie nur eine >angeben, wird die vorherige Datei überschrieben.


4

Ja, >>hängt an, >überschreibt / zerstört immer den vorherigen Inhalt.

ps -aux > log

ist das gleiche wie

rm log 2>/dev/null
ps -aux >> log

Auf Wintel ist es das gleiche für .bat, .cmdund .ps1Skripte zu; gemeinsames Erbe, gesunder Menschenverstand.


3

Der wichtigste Unterschied besteht darin, dass >die Shell eine Datei oder ein dateiähnliches Objekt mit O_WRONLY|O_CREAT|O_TRUNCFlags >>öffnet - die Datei wird erstellt oder abgeschnitten, wenn sie vorhanden ist, während die Datei mit O_WRONLY|O_CREAT|O_APPENDFlags geöffnet wird - die Datei wird erstellt oder angehängt, wenn sie vorhanden ist. Dies ist offensichtlich, wenn Sie Systemaufrufe verfolgen, z. B. mit

$ strace -e open,dup2 bash -c 'true >> /dev/null'
...
open("/dev/null", O_WRONLY|O_CREAT|O_APPEND, 0666) = 3
dup2(3, 1)                              = 1
dup2(10, 1)                             = 1

Und mit

$ strace -e open,dup2 bash -c 'true > /dev/null'
...
open("/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
dup2(3, 1)                              = 1
dup2(10, 1)                             = 1
+++ exited with 0 +++

Beachten Sie, dass in beiden Fällen der Dateideskriptor der geöffneten Datei auf den Dateideskriptor 1 (stdout) des Befehls dupliziert wird. Dieser wird von jedem Befehl übernommen, den die Shell gabelt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.