Вы говорите о for line in $(cat file); do
и подобные конструкции. Это:
- Неэффективно, потому что bash должен порождать подоболочку и запускать
cat
, читать вывод cat
- весь файл - в память, анализировать его (что является самой медленной частью), только затем выполнять итерацию по всем данным
- Ненадежный, потому что bash выполняет разбиение слов в данных - он разделяется не только на символы новой строки, но и на что-либо в $ IFS (пробелы, табуляции ...)
(Если вы используете $(<...)
вместо $(cat ...)
, вы экономите две миллисекунды в Linux, но все остальные недостатки остаются.)
Гораздо лучший вариант - использовать цикл read
в то while
:
while read -r line; do
echo "Input: $line"
done < myfile.txt
Или из программы:
cat file1 file2 file3 |
while read -r line; do
echo "Input: $line"
done
Это только читает столько, сколько необходимо, не выполняет ненужную обработку, но позволяет разделять настраиваемые поля, и во много раз быстрее и требует меньше ресурсов для больших файлов.
Если вы пытаетесь работать с выводом find
, вы должны использовать тот же шаблон:
find . -name "foo" -type f -print0 | while read -r -d '' file; do
echo "File: $file"
done
Смотрите также: