¿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.
fuente
¿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.
>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 auxse escribirá en filey si un archivo llamado fileya estaba presente, su contenido se sobrescribirá.
Y si lo usa ps aux >> file, la salida de ps auxse escribirá en filey si el archivo nombrado fileya 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.
si escribes en la terminal
ps aux > log
Pondrá la salida de ps auxregistrar el archivo con nombre.
entonces si pones
ps aux >> log
entonces la próxima salida se agregará debajo de la primera. si coloca solo uno >, sobrescribirá el archivo anterior.
Sí, >>agrega, >siempre sobrescribe / destruye el contenido anterior.
ps -aux > log
es lo mismo que
rm log 2>/dev/null
ps -aux >> log
En Wintel es lo mismo .bat, .cmdy los .ps1scripts también; herencia común, sentido común.
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_TRUNCbanderas: el archivo se creará o truncará si existe, mientras que >>abrirá un archivo con O_WRONLY|O_CREAT|O_APPENDbanderas: 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.