我正在尝试了解进程替换以及执行此操作时:
$ 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
可能的问题是什么?
我正在尝试了解进程替换以及执行此操作时:
$ 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
可能的问题是什么?
当您使用进程替换时,您正在替换的进程在后台运行,并且 shell 在显示提示之前不会等待它完成。
有时它会在 shell 显示下一个提示符之前显示它的输出,有时它会慢一点。它与bash的版本无关,纯粹是偶然的,哪个过程更快。
shell 正在等待您按 Enter 键,因为它已经显示了提示,并且正在等待您键入另一个命令。当您在命令提示符下时,shell 对显示的内容一无所知2
——那是输出,而不是您输入的一部分。
这通常不是问题,因为您通常不会对以交互方式向用户显示输出的程序使用进程替换。
这是流程替换的怪癖/设计缺陷;bash 只等待主命令终止。它不会等待替代进程结束。它在结束时创建一个竞争条件tee
:在打印下一个提示wc
之前完成吗?bash
有时会,有时不会。
有关详细说明和可能的解决方法,请参阅Stéphane Chazelas 的此 Unix.SE 答案。