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.
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.
Respostas:
>é 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.
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.