¿Podría alguien explicarme la diferencia entre >
y >>
cuando se utilizan comandos de shell?
Ejemplo:
ps -aux > log
ps -aux >> log
Parece que el resultado es el mismo en ambos sentidos.
¿Podría alguien explicarme la diferencia entre >
y >>
cuando se utilizan comandos de shell?
Ejemplo:
ps -aux > log
ps -aux >> log
Parece que el resultado es el mismo en ambos sentidos.
Respuestas:
>
se utiliza para sobrescribir (" clobber ") un archivo y >>
se utiliza para agregar a un archivo.
Por lo tanto, cuando lo use ps aux > file
, la salida de ps aux
se escribirá en file
y si un archivo llamado file
ya estaba presente, su contenido se sobrescribirá.
Y si lo usa ps aux >> file
, la salida de ps aux
se escribirá en file
y si el archivo nombrado file
ya estaba presente, el archivo ahora contendrá sus contenidos anteriores y también el contenido de ps aux
, escrito después de su contenido anterior de file
.
La diferencia más importante es que >
hace que Shell abra un archivo o un objeto similar a un archivo con O_WRONLY|O_CREAT|O_TRUNC
banderas: el archivo se creará o truncará si existe, mientras que >>
abrirá un archivo con O_WRONLY|O_CREAT|O_APPEND
banderas: el archivo se creará o se agregará si existe. Esto es evidente si rastrea llamadas del sistema, por ejemplo 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
Y 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 +++
Observe que en ambos casos el descriptor de archivo del archivo abierto está duplicado en el descriptor de archivo 1 (stdout) del comando, y eso será heredado por cualquier comando que forme el shell.