mapfile -t -u 7 arr < textfile
me dá
bash: mapfile: 7: invalid file descriptor: Bad file descriptor
Outros métodos mais detalhados de leitura de arquivos linha por linha que permitem tal descritor, por exemplo
read_w_while() {
while IFS="" read -u 7 -r l || [[ -n "${l}" ]]; do
echo "${l}"
done 7< textfile
O descritor padrão, 0
, é bastante usado. O uso desse descritor torna o script mais seguro contra interferências? Minha experiência é que até agora só presenciei, sou usuário do Ubuntu Desktop, tamanha interferência ao usar while IFS="" read -u 7 ...
com o descritor 7
. Quais poderiam ser as razões de tal interferência.
Conforme apontado nos comentários,
-u 7
e< textfile
não correspondem. Você precisa omitir-u 7
ou alterar o redirecionamento para7< textfile
como no segundo exemplo para que isso funcione. O erro ocorre porque o descritor de arquivo 7 (ainda) não está aberto.Quanto às questões de segurança, não vejo como o uso do descritor de arquivo 7 alterará a segurança de alguma forma. A única razão para usar outro descritor de arquivo como este seria se você deseja preservar o stdin pré-existente para algum outro uso nesse pipeline. E como este é um comando único (mapfile) em vez de um pipeline complexo, isso é discutível.
Sim, seria, se o fd 7 não estivesse aberto.
-u 7
apenas diz para ler o fd 7, mas não diz nada sobre como ou onde esse fd deveria estar.No seu segundo trecho, há um redirecionamento de entrada
7< textfile
que abre um arquivo no fd 7, então deve ser bastante natural que a leitura do fd 7 funcione.Você normalmente usaria outro descritor de arquivo se
read
precisar usar o stdin original ao mesmo tempo, por exemplo, se você ler um arquivo com umwhile read ...
loop, mas também executar algo que leia do terminal (stdin) dentro do loop.Agora, estritamente falando, a
-u fd
opção é desnecessária, já que o equivalente poderia ser alcançado com egread ... 0<&7
, mas isso tem a desvantagem de que o shell precisa fazer alguns malabarismos para organizar os descritores de arquivo nos locais corretos:read
, que lê de fd 0Tudo isso, em vez de apenas
read -u 7
, que lê fd 7(Escrevi originalmente "close fd 0" como uma etapa explícita, mas
dup2()
fecha o destino fd automaticamente)