Por que você não lê linhas com “for” no bash?

7

Eu li que usar "for" não é uma boa maneira de ler linhas no bash. Muitas pessoas dizem que isso é desajeitado e ineficiente na melhor das hipóteses e falha em muitos casos.

Gostaria de saber qual é a melhor maneira de ler linhas no bash. Obrigado.

Por exemplo:

$ for i in $(<afile); do echo "$i"; done
    
por Kyrol 01.12.2011 / 18:30

1 resposta

16

Não tenho certeza do que exatamente você quer dizer, mas acho que você está falando sobre for line in $(cat file); do * e construções semelhantes. Isso é ineficiente porque o bash precisa criar um subshell e executar cat , ler a saída de cat - o arquivo inteiro - na memória, analisá-lo (que é a parte mais lenta ), só então iterar sobre todos os dados. Não confiável porque o bash realiza separação de palavras nos dados - ele não apenas divide em caracteres de nova linha, mas também em qualquer item do $ IFS (espaços, tabulações ...)

(Se você usa $(<...) em vez de $(cat ...) , economiza dois milissegundos no Linux, mas todas as outras desvantagens permanecem.)

Uma opção muito melhor é usar read em um loop while :

while read -r line; do
    echo "Input: $line"
done < myfile.txt

Ou de um programa:

cat file1 file2 file3 |
while read -r line; do
    echo "Input: $line"
done

Isso só lê o quanto for necessário, não executa processamento desnecessário, mas permite a divisão de campo personalizada e é muitas vezes mais rápido e exige menos recursos em arquivos grandes.

Veja também:

por 01.12.2011 / 18:45

Tags