De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.

Redirecionamentos - Parte 1 - Relembrando e os redirecionadores básicos

Colaboração: Julio Cezar Neves

Data de Publicação: 01 de outubro de 2019

Essa semana vou lançar alguns artigos para explicar de uma vez por todas o uso interessante dos redirecionamentos.

Agora que você já sentiu como os redirecionamentos são importantes, vamos começar:

Eu sei que você já sabe, mas precisamos rever três redirecionadores básicos, com seus respectivos file descriptors (fd), para melhor compreender o texto que vem a seguir. Veja essa tabela:

Símbolo É o mesmo que: Redireciona
< 0< Entrada (stdin) de ARQUIVO
> 1> Saída (stdout) para ARQUIVO
2> 2> Saída de erro (stderr) para ARQUIVO

Os programas e/ou scripts esperam já encontrar esses três descritores de arquivos (file descriptor ou fd) abertos e disponíveis.

Existe sempre um stdin, stdout e um stderr associado a cada comando. Por convenção, um programa recebe os dados pelo fd 0 (stdin), manda a saída normal para o fd 1 (stdout) e a saída de erro para o fd 2 (stderr). Se um desses três fds não estiver aberto, você deve encontrar problemas.

Quando o xterm começa, antes de executar o Shell do usuário o xterm abre o device de terminal (/dev/pts/n) três vezes. Nesse ponto, o Shell herda três descritores de arquivo, e cada comando (processo filho) que é executado pelo Shell herda-os por sua vez, exceto quando esse comando é redirecionado.

Redirecionamento significa reassociar um dos descritores de arquivo a outro arquivo (ou a um pipe, ou qualquer coisa permissível). Descritores de arquivo podem ser reassociados localmente (para um comando, um grupo de comandos, um subshell, ...) ou globalmente, para o resto do Shell usando o comando exec.

Se você encontrar um:

ls 2>&1

Significa uma conexão temporária da saída de erro (2) do ls com o mesmo "recurso" do stdout (1) deste Shell.

Os principais usos dos descritores de arquivo constam na tabela a seguir. Observe que o que vale para os redirecionamentos de entrada serve também para os de saída.

Utilização Ação
&>ARQ Redireciona o stdout e stderr para o arquivo ARQ
FD1>&FD2 Redireciona o descritor FD1 para FD2. Todas as saídas do arquivo apontado por FD1 são enviadas para o dispositivo apontado por FD2
>&FD1 Redireciona a stdout para FD1. Todas as saídas para stdout irão para o arquivo apontado por FD1
FD1<>ARQ Abre o arquivo ARQ para leitura e gravação e associa a ele o descritor FD1
FD1>&- Fecha o dispositivo associado ao descritor FD1

Nesta tabela FD1 não é fd 1. Cada FD é um número arbitrário criado por você para designar um arquivo. Isso é muito útil quando temos diversos arquivos abertos. Mas vamos deixar para depois esses casos e por enquanto vamos nos ater ao 0, 1 e 2.

Quero popular um arquivo chamado Log com as mensagens do programa scr1.sh. Então é mole:

scr1.sh > Log

Mas também quero mandar as mensagens de erro para o mesmo arquivo. Posso fazer isso de 3 formas distintas:

1. A pior e mais óbvia:

 scr1.sh > Log 2> Log 

2. Uma melhorzinha:

scr1.sh > Log 2>&1

3. A melhor:

scr1.sh &> Log

Ao longo dos próximos artigos, esmiuçarei cada um dos itens desta tabela, e vou ficando por aqui, mas antes quero deixar uma pergunta no ar. Faça:

ls NaoExiste 2>&-

E me diga: onde foi parar a mensagem de erro do ls?


Não perca a oportunidade de aprender a programar em shell com o Mestre Julio Neves. As inscrições estão abertas para a última turma do ano.

Saiba mais e faça sua inscrição

Adicionar comentário

* Campos obrigatórios
5000
Powered by Commentics

Comentários

Nenhum comentário ainda. Seja o primeiro!


Veja a relação completa dos artigos de Julio Cezar Neves