Использование цикла while для чтения файла случайным образом прекращает чтение файла в середине

1472
noisesolo

У меня есть небольшой фрагмент кода, который читает файл, $ FUNCTION_FILE, который содержит список имен функций в формате:

func1 func2 func3 

Он прочитает строку, запустит функцию и будет повторять до тех пор, пока файл не будет готов. Вот фрагмент:

while read line; do LINE_NUMBER=`expr $LINE_NUMBER + 1` echo "LINE_NUMBER=$LINE_NUMBER"  $func done <$FUNCTION_FILE 

Я попал в ситуацию, когда иногда этот раздел кода прекращает чтение «$ FUNCTION_FILE» перед завершением и переходит к остальной части сценария. Иногда он читает только первую строку и пропускает остальные, иногда только вторую; Я никогда не вижу сообщение "LINE_NUMBER = $ LINE_NUMBER" для последующих строк.

Предполагая, что файл правильный, что может вызвать эту проблему?

1
Есть ли в строке `exit`? choroba 10 лет назад 0
Вы просите нас отладить произвольный код, который мы не видим? Может происходить что угодно, это зависит от того, что такое `$ func`. Пожалуйста, покажите нам фактические функции, которые вы используете, иначе мы не сможем помочь. terdon 10 лет назад 0
Извините за то, что так загадочно. Я не в состоянии разглашать какой-либо реальный код, я в основном пытаюсь собрать информацию о том, как скрипт может манипулировать stdin (как предполагает первый ответ). Спасибо за ваше время, я действительно ценю это. noisesolo 10 лет назад 0

1 ответ на вопрос

3
glenn jackman

Do any of your functions read from stdin (ex: the read command)? If so, that will slurp up the rest of the FUNCTION_FILE.

Change the while loop to use a different file descriptor:

line_num=0 while read -u3 line; do echo "LINE_NUMBER=$(( ++line_num ))" $func done 3<"$function_file" 

Get out of the habit of using ALL_CAPS_VARIABLES -- one day you'll accidentally use "PATH" and break your script.

Спасибо за предложение, я посмотрю глубже и посмотрим, так ли это. К сожалению, многие соглашения являются жертвами чрезвычайно старой и большой кодовой базы, но я очень ценю ваш совет и обязательно буду придерживаться его в своих собственных усилиях. noisesolo 10 лет назад 0

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