相关疑难解决方法(0)

进程替换输出乱序

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 …

bash process-substitution

16
推荐指数
2
解决办法
1980
查看次数

等待 Bash 进程替换子 shell

我将相同的内容通过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?

bash shell-script background-process process-substitution

7
推荐指数
1
解决办法
1706
查看次数