Qualcuno potrebbe spiegarmi la differenza tra >e >>quando si usano i comandi di shell?
Esempio:
ps -aux > log
ps -aux >> log
Sembra che il risultato sia lo stesso in entrambi i modi.
Qualcuno potrebbe spiegarmi la differenza tra >e >>quando si usano i comandi di shell?
Esempio:
ps -aux > log
ps -aux >> log
Sembra che il risultato sia lo stesso in entrambi i modi.
Risposte:
>viene utilizzato per sovrascrivere (" clobber ") un file e >>viene utilizzato per aggiungere un file.
Pertanto, quando si utilizza ps aux > file, l'output di ps auxverrà scritto in filee se un file denominato fileera già presente, il suo contenuto verrà sovrascritto.
E se usi ps aux >> file, l'output di ps auxverrà scritto su filee se il file nominato fileera già presente, il file conterrà ora i suoi contenuti precedenti e anche i contenuti di ps aux, scritti dopo i suoi contenuti precedenti file.
La differenza più importante è che >fa aprire alla shell un file o un oggetto simile a un file con O_WRONLY|O_CREAT|O_TRUNCflag - il file verrà creato o troncato se esiste, mentre >>apre il file con O_WRONLY|O_CREAT|O_APPENDflag - il file verrà creato o aggiunto se esiste. Ciò è evidente se si tracciano le chiamate di sistema, ad esempio con
$ 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
E con
$ 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 +++
Si noti che in entrambi i casi il descrittore di file del file aperto viene duplicato sul descrittore di file 1 (stdout) del comando e che verrà ereditato da qualsiasi comando la shell esegua.