У меня есть... нечетная проблема с оболочкой bash script, на которую я надеялся получить некоторое представление.
Моя команда работает над script, которая выполняет итерацию по строкам в файле и проверяет содержимое в каждом из них. У нас была ошибка, когда при запуске через автоматизированный процесс, в котором последовательно выполнялись разные скрипты, последняя строка не просматривалась.
Код, используемый для итерации по строкам в файле (имя, сохраненное в DATAFILE
, было
cat "$DATAFILE" | while read line
Мы могли бы запустить script из командной строки, и он увидит каждую строку в файле, включая последнюю, просто отлично. Однако при запуске автоматизированного процесса (который запускает script, который генерирует DATAFILE непосредственно перед script), последняя строка никогда не будет видна.
Мы обновили код, чтобы использовать следующее, чтобы перебирать строки, и проблема устранена:
for line in `cat "$DATAFILE"`
Примечание. DATAFILE не имеет новой строки, когда-либо написанной в конце файла.
Мой вопрос состоит из двух частей... Почему бы последняя строка не была видна исходным кодом, и почему это изменило бы значение?
Я только думал, что могу придумать, почему последняя строка не будет видна:
- Предыдущий процесс, который записывает файл, основывался на завершении процесса, чтобы закрыть дескриптор файла.
- Проблема script запускалась и открывала файл раньше, чем достаточно, чтобы, в то время как предыдущий процесс "закончился", он недостаточно "выключил/очистил", чтобы система автоматически закрыла дескриптор файла для этого.
Как бы то ни было, кажется, что если у вас есть 2 команды в оболочке script, первая должна быть полностью отключена к тому моменту, когда script запускает второй.
Любое понимание вопросов, особенно первого, будет очень оценено.