Первая строка в файле не всегда печатается в bash-скрипте

У меня есть скрипт bash, который печатает строку текста в файл, а затем вызывает второй скрипт, который печатает еще несколько данных в тот же файл. Давайте назовем их script1.sh и script2.sh. Причина, по которой он разделен на два сценария, заключается в том, что у меня разные версии script2.sh.

script1.sh:

rm -f output.txt
echo "some text here" > output.txt
source script2.sh

script2.sh:

./read_time >> output.txt
./run_program
./read_time >> output.txt

Вариации в трех строках в script2.sh повторяются.

Кажется, это работает большую часть времени, но время от времени файл output.txt не содержит строку "здесь какой-то текст". Сначала я подумал, что это потому, что я вызываю script2.sh так: ./script2.sh, Но даже используя source проблема все еще возникает. Проблема не воспроизводима, поэтому даже когда я пытаюсь что-то изменить, я не знаю, действительно ли это исправлено.

Что может быть причиной этого?

Изменить: сценарии очень просты. script1 в точности как вы видите здесь, но с разными именами файлов. сценарий 2 - это то, что я написал, но затем те же 3 строки повторяются, и ./run_program могут иметь разные аргументы. Я сделал grep для выходного файла, и для > но это нигде не появляется неожиданно.

Способ использования этих сценариев заключается в том, что script1 создается программой (единственное различие между версиями заключается в source script2.sh линия. Этот script1.sh затем запускается на другом компьютере (на самом деле Linux на FPGA), используя ssh. Перед этим выходной файл также удаляется с помощью ssh. Я не знаю почему, но я не написал все это. Также я проверил код, запущенный на хосте. Единственное упоминание выходного файла - это когда он удаляется с помощью ssh и когда он копируется обратно на хост после выполнения script1.

Редактировать 2: Мне наконец удалось сделать проблему воспроизводимой с разумной скоростью, удалив script2.sh всего, кроме однострочной печати, в файл. Это также позволило мне сделать тестирование немного быстрее. После этого у меня возникала проблема от 1 до 4 раз за каждые 10 прогонов. Удаление команды, которая удаляла файл через ssh до запуска скрипта, похоже, решило проблему. Я проверю это еще немного, чтобы быть уверенным, но я думаю, что это решено. Хотя я до сих пор не уверен, почему это будет проблемой. Я думал, что команда ssh не завершится, пока все команды удаления не будут выполнены.

2 ответа

Решение

Трудно сказать, не видя реального кода. Скорее всего, это опечатка, > вместо >>где-то в одном из файлов script2.sh.

Чтобы убедиться в этом, установите noclobber вариант с set -o noclobber, Оболочка прекратит работу при попытке записи в существующий файл с >,

Другая возможность заключается в том, что файл удаляется при определенных редких условиях. Или он поврежден какой-то командой, которая может иметь произвольный доступ к нему - ищите команды, использующие этот файл без >>, Или она используется какой-то командой как для ввода, так и для вывода, которые накладываются друг на друга - ищите файл, используемый с <,

Наконец, вы можете иметь состояние гонки с командой, выводящей в файл в фоновом режиме, запущенной до этого echo,

Можете ли вы grep все ваши сценарии для "output.txt"? Как насчет скриптов, вызываемых внутри read_time и run_program?

Похоже, что-то в одном из сценариев script2.sh должно быть либо перезаписано, либо усечено, либо выполнено подстановка в output.txt.

Например, мог быть '> output.txt', закопанный в условном выражении для условия, которое редко достигается. Просто предположение, но это объясняет, почему вы не всегда видите это.

Это интересная проблема. Пожалуйста, опубликуйте решение, когда найдете его!

Другие вопросы по тегам