¿Debo usar paréntesis angulares simples o dobles para redirigir a / dev / null?

18

La mayoría de las respuestas aquí [ 1 ] [ 2 ] [ 3 ] usan un paréntesis angular único para redirigir a / dev / null, así:

command > /dev/null

Pero agregar a / dev / null también funciona:

command >> /dev/null

Excepto por el personaje extra, ¿hay alguna razón para no hacer esto? ¿Alguno de estos es "más agradable" para la implementación subyacente de / dev / null?

Editar:
El (2) abierta página de manual dice lseek se llama antes de cada escritura en un archivo en modalidad de apertura:

O_APPEND
El archivo se abre en modo anexar. Antes de cada escritura (2), el desplazamiento del archivo se coloca al final del archivo, como con lseek (2). La modificación del desplazamiento del archivo y la operación de escritura se realizan como un solo paso atómico.

lo que me hace pensar que podría haber una pequeña penalización de rendimiento por usar >>. Pero, por otro lado, truncar / dev / null parece una operación indefinida de acuerdo con ese documento:

O_TRUNC
Si el archivo ya existe y es un archivo normal y el modo de acceso permite la escritura (es decir, es O_RDWR u O_WRONLY) se truncará a la longitud 0. Si el archivo es un FIFO o un archivo de dispositivo terminal, se ignora el indicador O_TRUNC. De lo contrario, el efecto de O_TRUNC no se especifica.

y la especificación POSIX dice >que truncará un archivo existente , pero O_TRUNC está definido por la implementación para los archivos del dispositivo y no se sabe cómo / dev / null debería responder al truncamiento .

Entonces, ¿truncar / dev / null realmente no está especificado? ¿Y las llamadas de Iseek tienen algún impacto en el rendimiento de escritura?

Morgan
fuente

Respuestas:

27

Por definición, /dev/nullhunde todo lo que está escrito en él , por lo que no importa si escribe en modo agregar o no, todo se descarta. Como no almacena los datos, en realidad no hay nada a lo que apegarse.

Entonces, al final, es más corto escribir > /dev/nullcon un >signo.

En cuanto a la adición editada:

La página de manual de open (2) dice que se llama a lseek antes de cada escritura en un archivo en modo anexar.

Si lees atentamente, verás que dice (énfasis mío):

el desplazamiento del archivo se coloca al final del archivo, como con lseek (2)

Es decir, en realidad no (necesita) llamar a la llamada al lseeksistema, y ​​el efecto tampoco es estrictamente el mismo: llamar lseek(fd, SEEK_END, 0); write(fd, buf, size);sin O_APPENDno es lo mismo que escribir en modo agregar, ya que con llamadas separadas otro proceso podría escribir en el archivo entre las llamadas del sistema, tirando a la basura los datos agregados. En el modo de agregar, esto no sucede (excepto en NFS, que no admite el modo de agregar real ).

El texto en el estándar no menciona lseeken ese punto, solo que las escrituras irán al final del archivo.

Entonces, ¿truncar / dev / null realmente no está especificado?

A juzgar por la escritura a la que te refieres, aparentemente está definida por la implementación. Lo que significa que cualquier implementación sensata hará lo mismo que con las tuberías y los TTY, es decir, nada. Una implementación de locura podría hacer algo más, y tal vez el truncamiento podría significar algo sensato en el caso de algún otro archivo de dispositivo.

¿Y las llamadas de Iseek tienen algún impacto en el rendimiento de escritura?

Pruébalo. Es la única forma de saber con seguridad en un sistema determinado. O lea la fuente para ver dónde el modo de agregar cambia el comportamiento, en cualquier lugar.

ilkkachu
fuente
-3

Si lo que quieres es eficiencia, úsala command >&-en su lugar. Esto cierra el descriptor de archivo en lugar de redirigirlo, por lo que no se pierde tiempo escribiéndole cosas.

db48x
fuente
3
No cierre transmisiones de menos de 3. Esto alias los descriptores std * con descriptores de archivos aleatorios; potencialmente con resultados catastróficos.
Joshua
77
Si solo cierra el descriptor de archivo, el programa obtendrá errores en cada llamada de escritura, probablemente generando mensajes de error molestos y posiblemente el programa finalizando antes de finalizar su tarea.
ilkkachu