进程替换 >(cmd) 输出不正确

Process substitution >(cmd) doesn't output correctly

我正在尝试了解进程替换以及当我执行此命令时:

$ tee >(wc -l) <<< $'aaa\nbbb'
aaa
bbb
$ 2

bash 在下一个提示后打印数字并等待我按回车键。

我正在使用 bash 4.4.12,遇到与 bash 4.3.48 相同的问题。 bash 4.3.30 没有问题,命令正确输出:

$ tee >(wc -l) <<< $'aaa\nbbb'
aaa
bbb
2

可能的问题是什么?

这是进程替换的一个怪癖/设计缺陷; bash 只等待主命令终止。它不会等待替代进程结束。它在 tee 结束时创建了一个竞争条件:wc 是否在 bash 打印下一个提示之前完成?有时会,有时不会。

有关详细说明和可能的解决方法,请参阅 this Unix.SE answer by Stéphane Chazelas

当您使用进程替换时,您要替换的进程在后台运行,shell 不会等待它完成才显示提示。

有时它会在 shell 显示下一个提示之前显示它的输出,有时它会慢一点。与bash的版本无关,只是偶然哪个过程更快。

shell 正在等待您按 enter 键,因为它已经显示提示并且正在等待您键入另一个命令。 shell 对您在命令提示符下显示的 2 一无所知——那是输出,不是您输入的一部分。

这通常不是问题,因为您通常不会对以交互方式向用户显示输出的程序使用进程替换。