Первая строка в файле не всегда печатается в 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', закопанный в условном выражении для условия, которое редко достигается. Просто предположение, но это объясняет, почему вы не всегда видите это.
Это интересная проблема. Пожалуйста, опубликуйте решение, когда найдете его!