2

我正在尝试了解进程替换以及执行此操作时:

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

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

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

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

可能的问题是什么?

4

2 回答 2

3

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

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

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

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

于 2018-01-12T02:07:39.957 回答
3

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

有关详细说明和可能的解决方法,请参阅Stéphane Chazelas 的此 Unix.SE 答案。

于 2018-01-12T02:03:18.097 回答