paulo1205
(usa Ubuntu)
Enviado em 06/04/2022 - 00:29h
slinkp escreveu:
Boa noite Paulo
Como faço para usar esse comando interno exec
Boa noite, prezado.
Eu geralmente acredito que ensinar a pescar é melhor do que dar o peixe. Você tentou ler pelo menos a documentação do Bash?
Eis como eu normalmente faço — e recomendo que se faça — a leitura de múltiplas linhas de um mesmo arquivo em um
script do
shell.
#!/bin/bash
# ...
usuario_encontrado=0
exec 3< /etc/passwd # “3” aqui é um número de descritor que não esteja em uso (0, 1 e 2 normalmente vêm prealocados, ligados ao terminal ou algum redirecionamento feito antes de invocar o script).
while read -u 3 linha; do # os argumentos “-u 3” mandam o read ser feito no descritor 3, que nós associamos acima a um arquivo.
if [[ "$usuario_desejado" = "${linha%%:*}" ]]; then # A sintaxe “${linha%%:*}” faz com a variável seja expandida com supressão de sufixo, que é considerado como sendo a primeira ocorrência de “:” seguido de uma quantidade qualquer de outros caracteres. Não preciso de cut nem de grep.
usuario_encontrado=1
break # Já encontrei o que estava procurando, então posso interromper o laço de repetição antecipadamente.
fi
done
exec 3<&- # Após terminar de ler, desaloca novamente o descritor 3, fechando o arquivo.
(( usuario_encontrado )) && echo "Encontrou o usuário." || echo "Usuário não encontrado." >&2
Eu considero essa construção melhor do que
while read linha; do
comandos
done < /etc/passwd
porque esse tipo de redirecionamento afeta não apenas o comando
read, mas tudo o que está dentro do corpo do laço de repetição, incluindo eventuais comandos externos que você invocar ali dentro — um erro relativamente comum é ter ali dentro um comando que pede confirmação ao ser executado, e a confirmação acabar consumindo do redirecionamento, em lugar de vir do terminal.
E é ainda melhor do que algo como
cat /etc/passwd | while read linha; do
comandos
done
porque este último, além de ter o mesmo problema de o redirecionamento afetar tudo o que vai dentro do laço de repetição, como no exemplo anterior, está numa
pipeline, o que faz com que o laço de repetição e tudo o que está dentro dele sejam executados num processo separado, de modo que se você alterar o valor de uma variável (como eu fiz quando mexi em
usuario_encontrado, no exemplo que eu recomendo), essa alteração não será visível depois que o laço de repetição acabar, já que a alteração foi feita num processo distinto.
... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)