Существует ли инструмент, который будет принимать входные данные из нескольких файлов или каналов и записывать их в стандартный вывод, не блокируя операции чтения, чтобы отдельные строки ввода выходили нетронутыми? Я в основном хочу мультиплексировать кучу входов на один выход без заусенцев линий.
$ combine file1 <(prog2) ... > nice-output.txt
- Меня не волнует порядок вывода
- Он не должен блокироваться, пока на некоторых входах есть данные
- Это должно быть эффективно (то есть, я могу понизить ваш Perl на одну строку;)
-L
выполнения команды и объедините выходные данные с текущим потоком и-a
запишите выходные данные в файл. Я посмотрю больше завтра. Если вы приведете более подробный пример, я постараюсь проработать его.Если процессы записывают строки в одном
write
вызове, который требует, чтобы процессы использовали буферизацию строк (обычно отключенную, если их стандартный вывод не является терминалом), вы можете просто направить их все в канал.Если процессы выполняют буферизацию строки только при записи в терминал, проще всего это использовать
script
. Это немного неуклюже: он может писать только в файл.Если программы пишут длинные строки или просто не используют буферизацию строк, этот подход не сработает. Вам понадобится программа-сборщик, которая читает и буферизует строки с каждого входа отдельно и выполняет синхронизацию на концах строк. Там нет стандартной утилиты с этим функционалом. Я второе предложение Калеба
multitail
.Вот скрипт Python, который читает строки, созданные несколькими командами, и выплевывает их в свой стандартный вывод, не разбивая строку. Я не проверял это много, поэтому будьте осторожны. Я не тестировал это вообще.
Пример использования:
источник
Да, мультитейл кажется связанным с понятием «окна» как подмножества терминала; Я не мог заставить его играть как компонент конвейера.
Так выглядит как мы Хафт сделать этому себе трещины суставы
Ах, это было хорошо.
(примечание: тестируется на двух наборах входных данных. ошибок может или не может быть)
источник