@zdravnik

Почему неожиданно обрывается цикл?

Есть скрипт:
#!/bin/bash

file="/tmp/test.csv"    # 879314 strok

for ((;;))
do

index=0
while read line; do
        array[$index]="$line"
        index=$(($index+1))
done < $file

for ((a=0; a < ${#array[*]}; a++))
do
echo "${array[$a]}" >> /tmp/test-cycle.csv
done

echo > /tmp/test-cycle.csv
done


Суть скрипта следующая, перечитывается файл /tmp/test.csv и построчно складывается в /tmp/test-cycle.csv, после того как файл перечитался весь, происходит его обнуление (echo > /tmp/test-cycle.csv) и снова перечитка и построчное складывание.

Так вот, даже если я закоменчу строку echo > /tmp/test-cycle.csv, у меня цикл по перечитке файла не дорабатывает, если следить за наполнением файла /tmp/test-cycle.csv с помощью команды tail, то там выскакивает "файл усечен".
Прошу заметить что исходный файл у меня имеет 879314 строки. Если натравить на файл например из 10к строк то все работает как часы, а с большим файлом происходит неожиданное усечение причем каждый раз в разном месте (т.е. где-то примерно в одном и том же, но все таки разном)

Почему так происходит? помогите сделать нормально пожалуйста.
  • Вопрос задан
  • 122 просмотра
Решения вопроса 1
saboteur_kiev
@saboteur_kiev Куратор тега bash
software engineer
Я подозреваю, что вы просто упираетесь в предел памяти, который bash выделяет для массива.
Например для ksh93 по умолчанию это ~4 мбайт. Навскидк какое ограничение в bash и как его посмотреть не скажу.
Но в данном скрипте, зачем вам вообще создавать массив? Вы можете сразу выводить в файл
while read line; do
  echo "$line" >> /tmp/test-cycle.csv
done < $file
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы