在Sh中拆分和重组标准输出

问题描述 投票:0回答:1

我基于How can I split and re-join STDOUT from multiple processes?建立了以下问题。

[以下Bash命令将command1的输出分成两个流,分别进入command2command3,然后将它们的输出组合并通过管道传递到command4

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

图形上看起来如下:

         command2
        /        \
command1          command4
        \        /
         command3

我将如何在Sh shell中执行此操作?

bash pipe sh stdout
1个回答
1
投票

代替进程替换,将fifo与后台进程一起使用。

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

示例在docker上的高山linux上的busybox上测试:

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
© www.soinside.com 2019 - 2024. All rights reserved.