Introdução
No Linux, o redirecionamento é um recurso poderoso que permite controlar para onde a entrada e a saída dos comandos são direcionadas. Você pode ter visto operadores como > ou >> em laboratórios anteriores. Eles são usados para redirecionar a saída para arquivos. Este laboratório apresentará o conceito de redirecionamento e o guiará por vários exemplos práticos, adequados para iniciantes sem conhecimento prévio de Linux.
Redirecionamento Básico de Saída
Vamos começar com o básico do redirecionamento de saída:
Abra o seu terminal. Você deve estar no diretório
/home/labex/project. Se não tiver certeza, você pode digitarpwd(print working directory) para verificar sua localização atual.Criaremos um novo arquivo chamado
redirectcom algum conteúdo. Digite o seguinte comando:echo 'hello labex' > redirectEste comando faz duas coisas:
echo 'hello labex'imprime o texto "hello labex"- O símbolo
>redireciona essa saída para um arquivo chamadoredirect
Se o arquivo não existir, ele será criado. Se já existir, seu conteúdo será sobrescrito.
Agora, vamos adicionar mais conteúdo ao mesmo arquivo:
echo 'labex.io' >> redirectO operador
>>é semelhante ao>, mas em vez de sobrescrever o arquivo, ele anexa o novo conteúdo ao final do arquivo existente.Para visualizar o conteúdo do arquivo que acabamos de criar e modificar, use o comando
cat:cat redirectVocê deverá ver as duas linhas que adicionamos ao arquivo: "hello labex" na primeira linha e "labex.io" na segunda linha.
Entendendo a Entrada, Saída e Erro Padrão
Antes de nos aprofundarmos no redirecionamento, vamos entender três conceitos importantes:
- Entrada Padrão (stdin): Esta é a fonte de entrada padrão, geralmente o seu teclado. É de onde o sistema espera que a entrada venha.
- Saída Padrão (stdout): Este é o destino de saída padrão, geralmente a sua tela. É para onde o sistema envia a saída normal.
- Erro Padrão (stderr): É para onde as mensagens de erro são enviadas, também geralmente para a sua tela. É separado do stdout para permitir que as mensagens de erro sejam tratadas de forma diferente, se necessário.
No Linux, eles são representados por descritores de arquivo, que são apenas números que representam arquivos abertos:
| Descritor de Arquivo | Arquivo de Dispositivo | Descrição |
|---|---|---|
0 |
/dev/stdin |
stdin |
1 |
/dev/stdout |
stdout |
2 |
/dev/stderr |
stderr |
Vamos ver um exemplo de como podemos usá-los:
Primeiro, vamos criar um novo diretório chamado
Documents:mkdir DocumentsEste comando cria um novo diretório. Se você receber um erro dizendo que o diretório já existe, não tem problema - significa que você pode usar o existente.
Agora, vamos criar um arquivo C neste diretório:
cat > Documents/test.c << EOF #include <stdio.h> int main() { printf("hello world\n"); return 0; } EOFEste comando faz algumas coisas:
cat >inicia o processo de escrita em um arquivoDocuments/test.cé o arquivo no qual estamos escrevendo<< EOFdiz ao shell para continuar aceitando entrada até encontrar "EOF" (End Of File)- As linhas entre eles são o conteúdo que estamos escrevendo no arquivo
- O
EOFfinal marca o fim da entrada
Agora, vamos visualizar o conteúdo deste arquivo:
cat Documents/test.cVocê deverá ver o código C que acabamos de criar.
Redirecionando o Erro Padrão
Agora, vamos explorar como redirecionar o erro padrão:
Tente ler dois arquivos, um que existe e outro que não existe:
cat Documents/test.c nonexistent.cVocê verá o conteúdo de
test.c(que existe) e uma mensagem de erro paranonexistent.c(que não existe). O conteúdo detest.cé enviado para o stdout, enquanto a mensagem de erro é enviada para o stderr.Agora, vamos redirecionar a saída padrão para um arquivo e o erro padrão para outro arquivo:
cat Documents/test.c nonexistent.c > output.log 2> error.logEste comando faz várias coisas:
cat Documents/test.c nonexistent.ctenta exibir o conteúdo de ambos os arquivos> output.logredireciona o stdout (descritor de arquivo 1) para um arquivo chamadooutput.log2> error.logredireciona o stderr (descritor de arquivo 2) para um arquivo chamadoerror.log
Visualize o conteúdo de ambos os arquivos:
echo "Output log:" cat output.log echo "Error log:" cat error.logVocê deverá ver o conteúdo de
test.cemoutput.loge a mensagem de erro sobrenonexistent.cemerror.log.
Combinando Saída Padrão e Erro Padrão
Às vezes, você pode querer redirecionar tanto a saída padrão quanto o erro padrão para o mesmo arquivo. Isso é particularmente útil quando você deseja capturar toda a saída de um comando, seja ela uma saída normal ou mensagens de erro.
Vamos tentar listar o conteúdo do nosso diretório atual e de um diretório inexistente em um único comando:
ls -l . nonexistent_directory > combined_output.log 2>&1Este comando faz várias coisas:
ls -l .lista o conteúdo do diretório atualnonexistent_directoryé uma tentativa de listar um diretório que não existe> combined_output.logredireciona o stdout para um arquivo chamadocombined_output.log2>&1redireciona o stderr para o mesmo lugar que o stdout (que écombined_output.logneste caso)
Agora, vamos verificar o conteúdo do nosso arquivo de saída combinada:
cat combined_output.logVocê deverá ver tanto a listagem do diretório quanto a mensagem de erro sobre o diretório inexistente neste arquivo.
Existe uma forma abreviada de redirecionar tanto o stdout quanto o stderr para o mesmo arquivo no bash:
ls -l . nonexistent_directory &> another_combined_output.logO operador
&>é equivalente a> file 2>&1.Verifique o conteúdo deste novo arquivo:
cat another_combined_output.logVocê deverá ver a mesma saída que no arquivo anterior.
Usos Avançados do /dev/null
O dispositivo /dev/null, frequentemente chamado de "bit bucket" ou "buraco negro", é um arquivo especial que descarta todos os dados gravados nele. Ele tem várias aplicações úteis em shell scripting e operações de linha de comando.
Suprimindo a saída de comandos: Já vimos como suprimir a saída padrão:
ls -l > /dev/nullE como suprimir tanto a saída padrão quanto o erro padrão:
ls -l nonexistent_directory > /dev/null 2>&1Suprimindo apenas mensagens de erro: Às vezes, você deseja ver a saída, mas não as mensagens de erro:
ls -l . nonexistent_directory 2> /dev/nullVocê deverá ver a listagem do diretório, mas não o erro sobre o diretório inexistente.
Usando /dev/null como um arquivo vazio: O
/dev/nullpode ser usado como uma entrada de arquivo vazia. Isso é útil para comandos que exigem um arquivo de entrada, mas você não deseja fornecer nenhuma entrada real. Por exemplo:grep "pattern" /dev/nullEste comando não produzirá nenhuma saída porque
/dev/nullé um arquivo vazio.Testando a existência de arquivos: Você pode usar o
/dev/nullpara testar se um arquivo existe sem produzir nenhuma saída:if cp Documents/test.c /dev/null 2> /dev/null; then echo "File exists and is readable" else echo "File does not exist or is not readable" fiEste script tenta copiar
test.cpara/dev/null. Se for bem-sucedido, significa que o arquivo existe e é legível.Limpando o conteúdo de um arquivo: Você pode usar o
/dev/nullpara limpar rapidamente o conteúdo de um arquivo:cat /dev/null > combined_output.logVerifique se o arquivo está agora vazio:
cat combined_output.logVocê não deverá ver nenhuma saída, indicando que o arquivo está agora vazio.
Resumo
Neste laboratório, você aprendeu sobre o redirecionamento de fluxo de dados no Linux. Você praticou:
- Redirecionamento básico de saída usando
>e>>. - Entendimento de entrada, saída e erro padrão.
- Redirecionamento de erro padrão usando
2>. - Descarte de saída redirecionando para
/dev/null.
Essas técnicas de redirecionamento são ferramentas poderosas no Linux que permitem controlar para onde a saída dos seus comandos é enviada. Elas são essenciais para scripts, logs e para gerenciar a saída de comandos de forma eficaz. À medida que você continuar trabalhando com o Linux, encontrará muitas situações em que essas técnicas serão úteis.



