进程替换 >(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
一无所知——那是输出,不是您输入的一部分。
这通常不是问题,因为您通常不会对以交互方式向用户显示输出的程序使用进程替换。
我正在尝试了解进程替换以及当我执行此命令时:
$ 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
一无所知——那是输出,不是您输入的一部分。
这通常不是问题,因为您通常不会对以交互方式向用户显示输出的程序使用进程替换。