Qual é a diferença entre ">" e ">>" no comando shell?

45

Alguém poderia me explicar a diferença entre >e >>ao usar comandos shell?

Exemplo:

ps -aux > log
ps -aux >> log

Parece que o resultado é o mesmo de qualquer maneira.

whale_steward
fonte
2
Para informações adicionais sobre alguns dos operadores bash, consulte também Qual é a diferença entre <<, <<< e <<no bash?
Sergiy Kolodyazhnyy

Respostas:

48

>é usado para substituir (" clobber ") um arquivo e >>é usado para anexar a um arquivo.

Assim, quando você usa ps aux > file, a saída de ps auxserá gravada filee, se um arquivo nomeado filejá estiver presente, seu conteúdo será sobrescrito.

E se você usar ps aux >> file, a saída de ps auxserá gravada filee, se o arquivo nomeado filejá estiver presente, o arquivo agora conterá o conteúdo anterior e também o conteúdo de ps aux, gravado após o conteúdo anterior de file.

jobin
fonte
11

se você escrever no terminal

ps aux > log

Colocará a saída de ps auxpara registrar o arquivo nomeado.

então se você colocar

ps aux >> log

a próxima saída será anexada abaixo da primeira. se você colocar apenas um, >ele substituirá o arquivo anterior.

souravc
fonte
4

Sim, >>acrescenta, >sempre substitui / destrói o conteúdo anterior.

ps -aux > log

é o mesmo que

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

Em Wintel é o mesmo para .bat, .cmde .ps1roteiros também; herança comum, senso comum.

mckenzm
fonte
3

A diferença mais importante é que >faz com que o shell abra um arquivo ou objeto semelhante a um arquivo com O_WRONLY|O_CREAT|O_TRUNCsinalizadores - o arquivo será criado ou truncado se existir, enquanto >>abre arquivo com O_WRONLY|O_CREAT|O_APPENDsinalizadores - o arquivo será criado ou anexado se existir. Isso é evidente se você rastrear chamadas do sistema, por exemplo, com

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

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

Observe que, nos dois casos, o descritor de arquivo do arquivo aberto é duplicado no descritor de arquivo 1 (stdout) do comando, e isso será herdado por qualquer comando que o shell bifurque.

Sergiy Kolodyazhnyy
fonte