Как выбрать () (т.е. одновременно читать из) стандартный ввод * и * файл в 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).