Devo usar colchetes angulares simples ou duplos para redirecionar para / dev / null?

18

A maioria das respostas aqui [ 1 ] [< um href="https://unix.stackexchange.com/questions/100722/how-do-i-completely-silence-a-cronjob-to-dev-null"> 2 ] [3 ] use um único colchete angular para redirecionar para / dev / null, assim:

command > /dev/null

Mas o acréscimo a / dev / null também funciona:

command >> /dev/null

Exceto pelo personagem extra, existe alguma razão para não fazer isso? É um desses "melhor" para a implementação subjacente de / dev / null?

Editar:
O aberto (2) manpage diz lseek é chamado antes de cada gravação em um arquivo no modo de anexação:

O_APPEND
The file is opened in append mode. Before each write(2), the file offset is positioned at the end of the file, as if with lseek(2). The modification of the file offset and the write operation are performed as a single atomic step.

o que me faz pensar que pode haver uma pequena penalidade de desempenho por usar >> . Mas, por outro lado, truncar / dev / null parece uma operação indefinida de acordo com esse documento:

O_TRUNC
If the file already exists and is a regular file and the access mode allows writing (i.e., is O_RDWR or O_WRONLY) it will be truncated to length 0. If the file is a FIFO or terminal device file, the O_TRUNC flag is ignored. Otherwise, the effect of O_TRUNC is unspecified.

e a especificação POSIX diz > truncará um arquivo existente , mas O_TRUNC é definido pela implementação para arquivos de dispositivos e não há nenhuma palavra sobre como / dev / null deve responder a ser truncado .

Então, está truncando / dev / null na verdade não especificado? E as chamadas lseek têm algum impacto no desempenho de gravação?

    
por flugga 15.03.2017 / 13:00

2 respostas

27

Por definição, /dev/null envia alguma coisa escrita para , por isso não Não importa se você escreve no modo append ou não, tudo é descartado. Como não armazena os dados, não há nada para acrescentar, na verdade.

Então, no final, é mais curto escrever > /dev/null com um sinal > .

Quanto à adição editada:

The open(2) manpage says lseek is called before each write to a file in append mode.

Se você ler atentamente, verá que está escrito (ênfase minha):

the file offset is positioned at the end of the file, as if with lseek(2)

Ou seja, ele não precisa (realmente) chamar a chamada de sistema lseek , e o efeito não é estritamente o mesmo: chamar lseek(fd, SEEK_END, 0); write(fd, buf, size); sem O_APPEND não é o mesmo que gravar em acrescentar modo, já que com chamadas separadas, outro processo poderia gravar no arquivo entre as chamadas do sistema, destruindo os dados anexados. No modo append, isso não acontece (exceto pelo NFS, que não suporta o modo real append ).

O texto no padrão não menciona lseek nesse ponto, apenas que escreve vai o fim do arquivo.

So, is truncating /dev/null actually unspecified?

A julgar pela escritura a que você se refere, aparentemente ela é definida pela implementação. Isso significa que qualquer implementação sã fará o mesmo que com pipes e TTYs, ou seja, nada. Uma implementação insana pode fazer outra coisa, e talvez o truncamento possa significar algo sensato no caso de algum outro arquivo de dispositivo.

And do the lseek calls have any impact on write performance?

Teste. É a única maneira de saber com certeza sobre um determinado sistema. Ou leia a fonte para ver onde o modo de acréscimo altera o comportamento, se for em qualquer lugar.

    
por 15.03.2017 / 13:14
-3

Se a eficiência for desejada, use command >&- . Isso fecha o descritor de arquivo em vez de redirecioná-lo, então não é desperdiçado tempo escrevendo coisas para ele.

    
por 15.03.2017 / 20:06