Как выбрать () (т.е. одновременно читать из) стандартный ввод * и * файл в bash?

У меня есть программа, которая принимает входные данные в одном FIFO и выводит выходные данные в другой FIFO. Я хочу написать небольшой скрипт для управления этой программой. Сценарий должен прослушивать как стандартный ввод (чтобы я мог вводить команды для настройки в реальном времени), так и вывод FIFO программы (чтобы он мог реагировать и на происходящие там события).

По сути, моя программа управления должна select между стандартным вводом и файлом (мой FIFO).

Мне нравится учиться понимать, как разрабатывать простые и элегантные bashрешения сложных проблем, и после небольшого почесывания я вспомнил, что это tail -f будет счастливо select на несколько файлов и сказать вам, когда один из них изменяется в режиме реального времени, поэтому я сначала попытался

tail -f <(od -An -vtd1 -w1) <(cat fifo)

читать оба стандартных ввода (я бы ранее запустить stty icanon min 1; этот od вызов показывает каждый символ stdin на отдельной строке вместе с его кодом ASCII и отлично подходит для анализа escape-последовательности) и моего FIFO. Это не удалось эпично (как это делает cat <(cat)): od запускается здесь как фоновая задача, поэтому он не получает доступ к управляющему TTY и завершается неудачей с загадочной "ошибкой ввода-вывода", которая была невероятно хорошо объяснена здесь.

Так что теперь я немного озадачен. Я понимаю, что могу использовать любой язык сценариев, например Perl/Python/Ruby/Tcl, чтобы решить эту проблему; Мой compsci/ инженерный вопрос заключается в том, смогу ли я решить эту проблему с помощью сценариев оболочки (Linux).

0 ответов

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