Linux é um sistema operacional interessante que hospeda alguns dispositivos virtuais para inúmeros propósitos. No que diz respeito a programas em execução no sistema, estes dispositivos virtuais agem como se fossem arquivos reais. Ferramentas podem solicitar e alimentar dados a partir destas fontes. Os dados são gerados pelo SO ao invés de lê-los a partir de um disco.
Um exemplo é /dev/null. É um ficheiro especial que está presente em todos os sistemas Linux. No entanto, ao contrário da maioria dos outros arquivos virtuais, ao invés de ler, ele é usado para escrever. O que quer que você escreva em /dev/null será descartado, esquecido no vazio. É conhecido como o dispositivo nulo em um sistema UNIX.
Por que você iria querer descartar algo no vazio? Vamos verificar o que é /dev/null e seu uso.
Prerequisites
Antes de mergulhar fundo no uso do /dev/null, temos que ter uma clara compreensão do fluxo de dados stdout e stderr. Veja este guia detalhado sobre stdin, stderr, e stdout.
Vamos ter uma atualização rápida. Sempre que qualquer utilitário de linha de comando é executado, ele gera duas saídas. A saída vai para stdout e o erro (se gerado) vai para stderr. Por padrão, estes dois fluxos de dados estão associados ao terminal.
Por exemplo, o seguinte comando irá imprimir a string dentro da aspas dupla. Aqui, a saída é guardada em stdout.
O próximo comando irá mostrar-nos o estado de saída do comando anteriormente executado.
Como o comando anterior correu com sucesso, o estado da saída é 0. Caso contrário, o estado da saída será diferente. O que acontece quando você tenta executar um comando inválido?
$ echo $?
Agora, precisamos de saber sobre o descritor de ficheiros. No ecossistema UNIX, estes são valores inteiros atribuídos a um arquivo. Ambos stdout (descritor de arquivo = 1) e stderr (descritor de arquivo = 2) têm um descritor de arquivo específico. Usando o descritor de arquivo (1 e 2 nesta situação), podemos redirecionar a stdout e stderr para outros arquivos.
Para começar, o exemplo seguinte redirecionará a stdout do comando echo para um arquivo de texto. Aqui, nós não especificamos o descritor do arquivo. Se não especificado, o bash irá usar stdout por defeito.
O seguinte comando irá redireccionar a stderr para um ficheiro de texto.
>
Using /dev/null
Redirecionando a saída para /dev/null
Agora, estamos prontos para aprender como usar /dev/null. Primeiro, vamos verificar como filtrar a saída normal e o erro. No comando seguinte, o grep tentará procurar por uma string (olá, neste caso) no diretório “/sys”.
No entanto, ele irá gerar um monte de erros, pois sem o privilégio de root, o grep não pode acessar um número de arquivos. Neste caso, resultará em erros de “Permission denied”. Agora, usando o redirecionamento, podemos obter uma saída mais clara.
A saída parece muito melhor, certo? Nada! Neste caso, o grep não tem acesso a muitos ficheiros e aqueles que são acessíveis não têm a string “olá”.
No exemplo seguinte, vamos pingar Google.
No entanto, não queremos ver todos aqueles resultados de ping com sucesso. Em vez disso, só nos queremos concentrar nos erros quando o ping não conseguiu chegar ao Google. Como fazemos isso?
Aqui, o conteúdo do stdout é despejado para /dev/null, deixando apenas os erros.
Redireccionar toda a saída para /dev/null
Em certas situações, a saída pode não ser útil em absoluto. Usando redirecionamento, podemos despejar toda a saída para o void.
Vamos quebrar um pouco este comando. Primeiro, estamos a despejar todo o stdout para /dev/null. Depois, na segunda parte, estamos a dizer ao bash para enviar o stderr para stdout. Neste exemplo, não há nada para enviar. No entanto, se você estiver confuso, você pode sempre verificar se o comando rodou com sucesso.
O valor é 2 porque o comando gerou muitos erros.
Se você tende a esquecer o descritor de arquivo stdout e stderr, o comando a seguir vai servir muito bem. É um formato mais generalizado do comando anterior. Ambos stdout e stderr serão redirecionados para /dev/null.
Outros exemplos
Este é um interessante. Lembra-se da ferramenta dd? É uma ferramenta poderosa para converter e copiar arquivos. Saiba mais sobre o dd. Usando o dd, podemos testar a velocidade de leitura sequencial do seu disco. Claro, não é uma medida precisa. No entanto, para um teste rápido, é bastante útil.
Haqui, usei a ISO Ubuntu 18.04.4 como o grande arquivo.
Simplesmente, você também pode testar a velocidade de download da sua conexão de internet.
Pensamentos finais
Elegantemente, você tem um claro entendimento do que é este arquivo /dev/null. É um dispositivo especial que, se escrito nele, descarta e se lido a partir dele, lê nulo. O verdadeiro potencial deste interessante recurso está em interessantes bash scripts.
Está interessado em bash scripting? Veja o guia para iniciantes em bash scripting.
Enjoy!