在尝试输出重定向和进程替换时,我偶然发现了以下命令及其结果输出:
me @ elem:〜$ echo foo>>(cat); echo bar bar me @ elem:〜$ foo
(是的,最后的空换行是有意的。)
因此,bash echo的栏会显示我通常的提示,echo的foo,echo的换行符,然后将光标留在那里。如果再次按下Enter键,它将在新行上打印提示,并将光标留在其后(按预期,当有人在空命令行上按下Enter键时)。
我期望它将foo写入文件描述符,cat读取它并回显foo,第二个回显回显的栏,然后返回到命令提示符。但这显然不是事实。
有人可以解释发生了什么吗?
根据时间的不同,您可能会看到foo
显示在提示之前bar
,之后bar
,甚至之后。添加一些延迟以获得一致的时间:
$ echo foo > >(sleep 1; cat); echo bar; sleep 2
bar
foo
$
bar
立即出现,然后foo
在一秒钟后出现,然后在下一秒钟后出现下一个提示。
发生的是bash在后台执行进程替换。
sleep 1; cat
,并为其建立管道。echo foo
。由于这不会填满管道的缓冲区,因此该echo
命令将终止而不会阻塞。echo bar
。sleep 2
。sleep 1
。sleep 1
返回子流程。子流程继续执行cat
。cat
将其输入复制到其输出(显示在屏幕上)并返回。sleep 2
返回。主shell进程完成执行,您会看到下一个提示。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句