4

Я хотел бы, чтобы выход A был входом для B и в то же время выход B был входом для A , возможно ли это?

Я попробовал наивную вещь: создание именованных каналов для A (pipeA) и B (pipeB), а затем:

pipeB | A | pipeA &
pipeA | B | pipeB &

Но это не работает (pipeB пуст и переключение порядка также не поможет).

Любая помощь будет оценена.

Пример:

Команда A может быть скомпилирована в виде этой программы на C:

#include <stdio.h>

int main()
{
    printf("0\n");

    int x = 0;
    while (scanf("%d", &x) != EOF)
    {
        printf("%d\n", x + 1);
    }
    return 0;
}

Команда B может быть скомпилирована в виде этой программы на C:

#include <stdio.h>

int main()
{    
    int x = 0;
    while (scanf("%d", &x) != EOF)
    {
        printf("%d\n", x + x);
    }
    return 0;
}

2 ответа2

2

Я хотел бы, чтобы выход A был входом для B, и в то же время выход B был входом для A, возможно ли это?

Я не понимаю, как это могло бы сработать.

Если оба процесса зависят друг от друга для генерирования вывода, процесс B будет ждать, пока процесс A не выдаст какой-либо вывод, но процесс A не будет генерировать какой-либо вывод, пока не получит ввод от процесса B.

Оба процесса будут блокироваться навсегда.

РЕДАКТИРОВАТЬ:

ОП прокомментировал ниже другой случай, когда процесс A генерирует некоторый вывод и затем ожидает ввода для процесса B, в то время как процесс B просто ожидает процесса A.

В этом случае мы можем заставить работать "взаимный трубопровод". Создайте два скрипта:

/tmp/multualpipingA (этот скрипт генерирует некоторый вывод с echo process A и ожидает):

#!/bin/bash

echo process A
while read; do
    echo process A says: \"$REPLY\"
    sleep 1
done < /dev/stdin

и /tmp/multualpipingB (этот скрипт реагирует только на ввод):

#!/bin/bash

while read; do
    echo process B says: \"$REPLY\"
    sleep 1
done < /dev/stdin

Теперь откройте две терминальные сессии, "1" и "2", и введите в следующем порядке:

session1$ mkfifo /tmp/fifo{A,B}

session1$ cat /tmp/fifoB | /tmp/multualpipingB | tee /tmp/fifoA Enter

session2$ cat /tmp/fifoA | /tmp/multualpipingA | tee /tmp/fifoB Enter

Вы увидите этот вывод:

process A
process A says: "process B says: "process A""
process A says: "process B says: "process A says: "process B says: "process A""""

и это:

process B says: "process A"
process B says: "process A says: "process B says: "process A"""
process B says: "process A says: "process B says: "process A says: "process B says: "process A"""""

(протестировано на OS X 10.8.2 "Montain Lion")

2

Попробуйте сделать это, если у вас есть :

command | tee >(command1) | tee >(command2)

Это называется процесс замены

Пример из реальной жизни © ® ™:

$ echo foobar | tee >(grep -o "f") | tee >(grep -o "r")
foobar
r
f
$ 

См. Http://mywiki.wooledge.org/ProcessSubstitution или http://mywiki.wooledge.org/BashFAQ/024 для общего использования.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .