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.
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
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comentários