Я немного потренировался в написании сценариев оболочки, читая вводные данные из других программ, но не уверен, как решить эту проблему.
ОБЗОР
Программа robinbotter , чьи внутренние компоненты, которые я не могу исправить / изменить, получает свои данные из файлов equities.sym и blacklist.sym , каждый простой текстовый файл содержит один символ тикера на строку.
Когда все работает нормально, его вывод выдает:
...
Downloading instruments: [ AFL KELYB LFUS ]
...
Когда он ломается из-за внутренних ошибок,
...
Downloading instruments: [ AFL KELYB LFUS LNVGY
и останавливается там, без дальнейшего вывода, давая код выхода 0 как в нормальном случае (к сожалению).
Символы тикера печатаются с небольшой задержкой - без перевода строки - между ними, пока программа их обрабатывает.
Когда он сталкивается с LNVGY или непредсказуемым множеством других возможностей, он каким-то образом не может их обработать или, по крайней мере, пропустить, вместо этого происходит сбой без надлежащего исключения или кода ошибки.
ВОПРОС
Я пытаюсь написатьминималистичный скрипт в BASH (например, retryRB.sh ./robinbotter), который:
- Каким-то образом отслеживает оперативный небуферизованный вывод robinbotter, используя регулярное выражение или другой метод для обнаружения при выводе строки, содержащей " Загрузка инструментов: [ "не заканчивается на" ]"до завершения программы.В этом случае:
Возьмите последний напечатанный символ (например, LNVGY ), который вызывает сбой программы, и добавьте его в конец файла blacklist.sym .Как и в случае
echo $ lastSymbol >> blacklist.sym
Перезапустите программу robinbotter, сохранив исходные параметры командной строки: $ @
Я знаком с такими инструментами, как awk и sed, и был бы готов создать короткое решение в Ruby, если бы Bash его не вырезал.