在 Sh 中拆分和重组标准输出
Split and recombine stdout in Sh
我根据 How can I split and re-join STDOUT from multiple processes? 提出以下问题。
下面的 Bash 命令将 command1
的输出分成两个流,分别进入 command2
和 command3
,然后将它们的输出合并并通过管道输送到 command4
.
((command1 | tee >(command2 >&3) | command3) 3>&1) | command4
图形如下所示:
command2
/ \
command1 command4
\ /
command3
我如何在 Sh shell 中执行此操作?
使用带有后台进程的 fifo 代替进程替换。
fifo=$(mktemp -u)
mkfifo "$fifo"
{
command2 <"$fifo" &
command1 | tee "$fifo" | command3
wait
} | command4
示例在 docker 中的 alpine linux 上的 busybox 上测试:
f() { sed 's/^/'""' /'; } ;
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
我根据 How can I split and re-join STDOUT from multiple processes? 提出以下问题。
下面的 Bash 命令将 command1
的输出分成两个流,分别进入 command2
和 command3
,然后将它们的输出合并并通过管道输送到 command4
.
((command1 | tee >(command2 >&3) | command3) 3>&1) | command4
图形如下所示:
command2
/ \
command1 command4
\ /
command3
我如何在 Sh shell 中执行此操作?
使用带有后台进程的 fifo 代替进程替换。
fifo=$(mktemp -u)
mkfifo "$fifo"
{
command2 <"$fifo" &
command1 | tee "$fifo" | command3
wait
} | command4
示例在 docker 中的 alpine linux 上的 busybox 上测试:
f() { sed 's/^/'""' /'; } ;
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