这
echo one; echo two > >(cat); echo three;
Run Code Online (Sandbox Code Playgroud)
命令给出了意外的输出。
我读到:如何在 bash 中实现进程替换?以及互联网上有关进程替换的许多其他文章,但不明白为什么它会这样。
预期输出:
one
two
three
Run Code Online (Sandbox Code Playgroud)
实际输出:
prompt$ echo one; echo two > >(cat); echo three;
one
three
prompt$ two
Run Code Online (Sandbox Code Playgroud)
此外,从我的角度来看,这两个命令应该是等效的,但它们不是:
##### first command - the pipe is used.
prompt$ seq 1 5 | cat
1
2
3
4
5
##### second command - the process substitution and redirection are used.
prompt$ seq 1 5 > >(cat)
prompt$ 1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)
为什么我认为,它们应该是一样的?因为,两者都通过匿名管道将seq
输出连接到cat …
我将相同的内容通过tee
, 重定向和处理替换子shell传递给多个命令,如下所示:
#!/usr/bin/env bash
echo 'hello' | tee \
>( sleep 3; cat /dev/stdin ) \
>( sleep 2; cat /dev/stdin ) \
>( sleep 1; cat /dev/stdin )
wait # Doesn't work :(
Run Code Online (Sandbox Code Playgroud)
但是,我看到的是进程替换子shell输出在主脚本退出后写入终端并且wait
不起作用:
$ ./test.sh
hello
$ hello
hello
hello
Run Code Online (Sandbox Code Playgroud)
如何正确等待进程替换子shell?