Qual è la differenza tra “>” e “>>” nel comando shell?


Risposte:


48

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


11

se scrivi nel terminale

ps aux > log

Inserirà l'output di ps auxper registrare il file denominato.

quindi se lo metti

ps aux >> log

quindi l'output successivo verrà aggiunto sotto il primo. se ne metti solo uno >, sovrascriverà il file precedente.


4

Sì, >>aggiunge, >sovrascrive / distrugge sempre il contenuto precedente.

ps -aux > log

equivale a

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

Su Wintel è lo stesso per .bat, .cmde .ps1gli script di troppo; patrimonio comune, buon senso.


3

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.