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

45

Könnte mir jemand den Unterschied zwischen >und >>bei der Verwendung von Shell-Befehlen erklären ?

Beispiel:

ps -aux > log
ps -aux >> log

Es scheint, dass das Ergebnis so oder so dasselbe ist.

whale_steward
quelle
2
Weitere Informationen zu einigen Bash-Operatoren finden Sie unter Was ist der Unterschied zwischen <<, <<< und <<in Bash?
Sergiy Kolodyazhnyy

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.

Job in
quelle
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.

souravc
quelle
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.

mckenzm
quelle
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.

Sergiy Kolodyazhnyy
quelle