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.
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.
Antworten:
>
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 aux
in file
eine file
bereits vorhandene Datei geschrieben, und der Inhalt dieser Datei wird überschrieben.
Und wenn Sie verwenden ps aux >> file
, wird die Ausgabe von ps aux
in file
die Datei geschrieben, und wenn die genannte Datei file
bereits 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
.
Der wichtigste Unterschied besteht darin, dass >
die Shell eine Datei oder ein dateiähnliches Objekt mit O_WRONLY|O_CREAT|O_TRUNC
Flags >>
öffnet - die Datei wird erstellt oder abgeschnitten, wenn sie vorhanden ist, während die Datei mit O_WRONLY|O_CREAT|O_APPEND
Flags 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.