eu tenho um script com um loop while assim:
while IFS= read -r name; do
{body}
done < names.txt
a condição de loop precisa ler nomes de um arquivo, mas {body}
precisa ler de stdin; o script acima fará a {body}
leitura do arquivo, o que é um erro;
eu posso dar a volta com outro fd:
while IFS= read -r name <&3; do
{body}
done 3< names.txt
perguntas:
esta é a melhor solução?
é seguro/recomendado usar o descritor de arquivo 3? um número fd mais alto dará menos chance de causar um conflito?
Usar um descritor de arquivo separado para o
read
comando é uma boa solução.Você tem a garantia de que os descritores de arquivo entre 3 e 9 estarão disponíveis para você fazer isso. O shell não os usará para mais nada. Apenas descritores de arquivo 0, 1 e 2 têm usos predefinidos, e você pode achar que usar descritores com valores maiores que 9 funciona, mas não há tal garantia.
O padrão POSIX diz :
Usar descritores de arquivo acima de 9 pode ser perigoso, dependendo de qual número e shell você usa:
bash
usa fd 255 internamente.zsh
,dash
epdksh
usa fd 10 internamente.ksh93
parece usar fd 3 (mas isso parece um bug, está conectado ao diretório que serve como ponto de montagem do sistema de arquivos atual).