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.
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.
Odpowiedzi:
>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.
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ę.