У меня есть две (UNIX) программы A и B, которые читают и пишут из stdin/stdout.
Моя первая проблема заключается в том, как подключить стандартный вывод A к стандартному вводу B и стандартный вывод B к стандартному вводу A. То есть что-то вроде A | B, но двунаправленная труба. Я подозреваю, что мог бы решить эту проблему, используя exec для перенаправления, но я не мог этого добиться работать. Программы интерактивны, поэтому временный файл не подойдет.
Вторая проблема заключается в том, что я хотел бы дублировать каждое направление и передать дубликат через программу ведения журнала на стандартный вывод, чтобы я мог видеть трафик (на основе текстовой строки), который проходит между программами. Здесь мне может сойти с рук тройник >(...), если я смогу решить первую проблему.
Кажется, что обе эти проблемы должны иметь хорошо известные решения, но я ничего не смог найти.
Я бы предпочел решение оболочки POSIX или, по крайней мере, что-то, что работает в bash на cygwin.
Благодаря вашим ответам я пришел к следующему решению. Команды A/B используют nc для прослушивания двух портов. Программа регистрации использует sed (с -u для небуферизованной обработки).
bash-3.2$ fifodir=$(mktemp -d)
bash-3.2$ mkfifo "$fifodir/echoAtoB"
bash-3.2$ mkfifo "$fifodir/echoBtoA"
bash-3.2$ sed -u 's/^/A->B: /' "$fifodir/echoAtoB" &
bash-3.2$ sed -u 's/^/B->A: /' "$fifodir/echoBtoA" &
bash-3.2$ mkfifo "$fifodir/loopback"
bash-3.2$ nc -l -p 47002 < "$fifodir/loopback" \
| tee "$fifodir/echoAtoB" \
| nc -l -p 47001 \
| tee "$fifodir/echoBtoA" > "$fifodir/loopback"
Это прослушивает подключение к портам 47001 и 47002 и выводит весь трафик на стандартный вывод.
В оболочке 2 выполните:
bash-3.2$ nc localhost 47001
В оболочке 3 выполните:
bash-3.2$ nc localhost 47002
Теперь строки, введенные в оболочке 2, будут записаны в оболочку 3 и наоборот, а трафик будет зарегистрирован в оболочке 1, что-то вроде:
B->A: input to port 47001
A->B: input to port 47002
Вышеупомянутое было протестировано на Cygwin
Обновление: приведенный выше скрипт перестал работать через несколько дней (!). Судя по всему, он может зайти в тупик. Некоторые предложения в ответах могут быть более надежными.