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.

$ echo “Hello World”

O próximo comando irá mostrar-nos o estado de saída do comando anteriormente executado.

$ echo $?

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?

$ adfadsf
$ 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.

$ echo “Hello World” > log.txt

O seguinte comando irá redireccionar a stderr para um ficheiro de texto.

$ asdfadsa 2> error.txt

>

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”.

$ grep -r olá /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.

$ grep -r hello /sys/ 2> /dev/null

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.

$ ping google.com

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?

$ ping google.com 1> /dev/null

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.

$ grep -r hello /sys/ > /dev/null 2>&1

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.

$ echo $?

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.

$ grep -r hello /sys/ &> /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.

$ dd if=<big_file> of=/dev/null status=progress bs=1M iflag=direct

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.

$ wget -O /dev/null big_file_link>

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!

Deixe uma resposta

O seu endereço de email não será publicado.