Jaka jest różnica między „>” a „>>” w poleceniu powłoki?

45

Czy ktoś mógłby mi wyjaśnić różnicę między używaniem poleceń powłoki >a >>używaniem poleceń powłoki?

Przykład:

ps -aux > log
ps -aux >> log

Wygląda na to, że wynik jest taki sam w obu przypadkach.

whale_steward
źródło
2
Aby uzyskać dodatkowe informacje na temat niektórych operatorów bash, zobacz także Jaka jest różnica między <<, <<< i <<w bash?
Sergiy Kolodyazhnyy,

Odpowiedzi:

48

>służy do zastępowania („ clobber ”) pliku i >>służy do dołączania do pliku.

Tak więc, gdy użyjesz ps aux > file, wynik ps auxzostanie zapisany filei jeśli plik o nazwie filebył już obecny, jego zawartość zostanie zastąpiona.

A jeśli użyjesz ps aux >> file, wynik ps auxzostanie zapisany do, filea jeśli plik o nazwie filebył już obecny, plik będzie teraz zawierał swoją poprzednią zawartość, a także zawartość ps aux, zapisaną po jego starszej zawartości file.

Praca w
źródło
11

jeśli piszesz w terminalu

ps aux > log

Umieści wyjście ps auxlogu o nazwie plik.

to jeśli umieścisz

ps aux >> log

następne wyjście zostanie dołączone poniżej pierwszego. jeśli umieścisz tylko jeden >, zastąpi on poprzedni plik.

souravc
źródło
4

Tak, >>dołącza, >zawsze zastępuje / niszczy poprzednią zawartość.

ps -aux > log

jest taki sam jak

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

Na Wintel to samo za .bat, .cmda .ps1skrypty zbyt; wspólne dziedzictwo, zdrowy rozsądek.

mckenzm
źródło
3

Najważniejszą różnicą jest to, >że powłoka otwiera plik lub obiekt podobny O_WRONLY|O_CREAT|O_TRUNCdo pliku z flagami - plik zostanie utworzony lub obcięty, jeśli istnieje, podczas gdy >>otwiera plik z O_WRONLY|O_CREAT|O_APPENDflagami - plik zostanie utworzony lub dołączony, jeśli istnieje. Jest to widoczne, jeśli śledzisz wywołania systemowe, na przykład za pomocą

$ 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

I z

$ 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 +++

Zauważ, że w obu przypadkach deskryptor pliku otwartego pliku jest duplikowany w deskryptorze pliku 1 (stdout) polecenia i zostanie on odziedziczony przez dowolne polecenie rozwidlone przez powłokę.

Sergiy Kolodyazhnyy
źródło