O que é / dev / null e como ele pode ajudá-lo?

Se já temos algumas noções da árvore de diretórios GNU / Linux, devemos pelo menos estar familiarizados com a referência / dev /, que é efetivamente onde todos os arquivos relacionados dispositivos de hardware.

Se olharmos no diretório / Dev / veremos um "arquivo" chamado nulo, mas se quisermos abri-lo para ver seu conteúdo, o sistema nos dirá que não é possível, pois não é um conteúdo comum. Anexei a palavra arquivo porque, como todos sabem no Linux, tudo (hardware e software) é representado como um arquivo.

Esta é uma contribuição de Daniel Durante, tornando-se assim um dos vencedores do nosso concurso semanal: «Compartilhe o que você sabe sobre o Linux«. Parabéns Daniel!

A qual dispositivo / dev / null corresponde?

Para fins práticos, imagine uma lata de lixo, um poço sem fundo ou espaço sideral onde jogar qualquer coisa sem a possibilidade de recuperá-la (não importa o quanto os caras da NASA tentem).

Mas se eu já tenho comandos como rm, por que quero algo novo para excluir?

Porque a maneira como os dois “buracos negros” funcionam é completamente diferente: como você faria para substituir a saída padrão de um erro em um comando dentro de um script de shell em tempo de execução? É aqui que entra / dev / null.

Vamos ver com um exemplo.

Criamos um arquivo chamado tests contendo a string "Hello World". Se quisermos representar o conteúdo desse arquivo na linha de comando, podemos fazer isso da seguinte maneira:

usuário @ laptop: ~ $ cat teste
Olá mundo

Se o arquivo não existisse ou fosse nomeado como testes (com um 's' no final), obteríamos o seguinte erro no console:

usuário @ laptop: ~ $ cat testes
cat: tests: O arquivo ou diretório não existe

O que podemos fazer para evitar a mensagem de erro? Bem, basta redirecionar a saída do comando, em caso de erro, para uma "lata de lixo", ou seja, para / dev / null

Como especificamos isso em caso de erro? Aqui você insere os valores padrão de entrada, saída e erro para um programa: STDIN, STDOUT e STDERR (que podem ser substituídos por 0, 1 e 2, respectivamente). Desta forma, se colocarmos ...

usuário @ laptop: ~ $ cat tests 2> / dev / null
usuário @ laptop: ~ $

… Veremos que a mensagem de erro não será produzida no console.

Você deve ter cuidado porque a sintaxe é essencial: entre os caracteres 2 e> não deve haver espaço. Caso contrário, daria o seguinte:

usuário @ laptop: ~ $ cat tests 2> / dev / null
cat: tests: O arquivo ou diretório não existe
cat: 2: O arquivo ou diretório não existe

Em contraste, um espaço entre> e / dev / null não afetará negativamente o resultado.

Também podemos usar o redirecionamento de erro, por exemplo, para capturar erros em um arquivo de log da seguinte maneira:

usuário @ laptop: ~ $ cat tests 2> err.log

Outro caso interessante seria a coleta de resultados em outro arquivo desde que não ocorra erro, para o qual colocaríamos:

usuário @ laptop: ~ $ cat test 1> output_result 2> err.log

Por fim, vale a pena colocar a expressão «> / dev / null 2> & 1» em que se combinam a saída padrão e a saída de erro, redirecionando-as para que em nenhum caso a informação de saída seja obtida.