Разделить и рекомбинировать стандартный вывод в Sh - PullRequest
0 голосов
/ 07 октября 2019

Я основываю следующий вопрос на Как я могу разделить и повторно присоединить STDOUT из нескольких процессов? .

Следующая команда Bash разбивает вывод command1 на два потока, идущихв command2 и command3 перед тем, как объединить их выводы и передать их в command4.

((command1 | tee >(command2 >&3) | command3) 3>&1) | command4

Графически это выглядит следующим образом:

         command2
        /        \
command1          command4
        \        /
         command3

Как бы я это сделал в оболочке Sh?

1 Ответ

2 голосов
/ 07 октября 2019

Вместо подстановки процесса используйте fifo с фоновым процессом.

fifo=$(mktemp -u)
mkfifo "$fifo"
{
    command2 <"$fifo" &
    command1 | tee "$fifo" | command3
    wait
} | command4

Пример, протестированный на busybox на alpine linux в docker:

f() { sed 's/^/'"$1"' /'; } ; 
fifo=$(mktemp -u); mkfifo "$fifo"; 
{ f 2 <"$fifo" & seq 3 | tee "$fifo" | f 3; wait; } | f 4;
rm "$fifo";

выдаст:

4 3 1
4 3 2
4 3 3
4 2 1
4 2 2
4 2 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...