Linux Дублирующий буфер? - PullRequest
0 голосов
/ 09 июля 2020

Сейчас моя установка выглядит так:

command1 | buffer | command2

Я хочу, чтобы третья команда, "command3", также читалась из буфера. Моя попытка обходного пути заключалась в том, чтобы запустить процесс как дочерний процесс и просто передать команду command1 | буфер | команда3. Проблема в том, что это не только приводит к ошибкам чтения command1, command2 также «крадет» данные из command3 или иначе. В основном то, что я хочу достичь, - это поведение, подобное tee, но вместо того, чтобы пересылать его в буфер и файл, я хочу пересылать его в два буфера, без влияния command2 на command3 или наоборот. Примерно так:

command1 | buffer1          | command2
              \
               ---- buffer2 | command3 

Это тоже должно происходить одновременно.
Как я мог добиться такого поведения? Существуют ли кодовые или некодовые решения?
Изменить: я работаю с бесконечными потоками, а именно с аудио.

Ответы [ 2 ]

1 голос
/ 09 июля 2020

Вы можете сделать что-то подобное на bash.

echo hello | tee >(echo command1 >&2) | echo command2

См. Этот ответ

0 голосов
/ 09 июля 2020

Использование подстановки команд tee и bash:

Примеры команд:

$ alias command1='perl -e'\''$|=1; CORE::say for qw( a b c )'\' 

$ alias command2='perl -pe'\''$|=1; $_ = "x $_"'\' 

$ alias command3='perl -pe'\''$|=1; $_ = "y $_"'\' 

Решение:

$ exec 3>&1   # dup2(1,3)

$ command1 | tee >( command2 >&3 ) | command3
x a
y a
x b
y b
x c
y c

$ exec 3>&-   # close(3)

(В отличие от другого ответа опубликованный в то же время, этот не предполагает, что STDOUT и STDERR одинаковы.)

(Кажется, что строки обрабатываются синхронно command2 и command3, что не может быть гарантировано без дополнительной связи. Чтобы даже приблизиться, command1 необходимо избегать буферизации вывода.)

Если вы хотите, чтобы программа делала это вместо использования оболочки, это просто случай выполнения следующих действий в грубой форме. детали:

  1. Для i дюймов 2, 3,
    1. Создать трубу pipe<em>i</em>.
    2. Вилка.
    3. Если в дочернем,
      1. Закройте конец записи pipe<em>i</em>.
      2. T ie конец чтения pipe<em>i</em> на fd 1.
      3. Выполнить command<em>i</em>.
    4. Закройте конец чтения pipe<em>i</em>.
    5. Установите флаг close-on-exe c конца записи pipe<em>i</em> в значение true .
  2. Написать в обе трубы.
...