过程替换>(cmd)没有正确输出

时间:2018-01-12 01:59:04

标签: linux bash process-substitution

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

$ 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

可能出现什么问题?

2 个答案:

答案 0 :(得分:3)

这是一个过程替代的怪癖/设计缺陷; bash只等待主命令终止。它不会等待替代流程结束。当tee结束时,它会创建竞争条件:wcbash打印下一个提示之前完成了吗{ "to": "fsfsdfsdfsadf", "notification": { "title": "Alert Title", "body": "Alert body with detailed description.", "icon": "@drawable/ic_launcher" }, "data": { "title": "custom", "user-id": "123", "user-age": "44", "parameters": [{ "parameter": "1" }] } } ?有时它确实如此,有时它不会。

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

答案 1 :(得分:3)

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

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

shell正在等待你按Enter键,因为它已经显示了提示,它正在等你输入另一个命令。 shell对命令提示符下显示的2一无所知 - 这是输出,而不是输入的一部分。

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