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:
- Wiki do Greg. Por que você não lê as linhas com "para"
- Wiki do Greg. Bash FAQ # 001: Como posso ler um arquivo linha por linha?