bash如何处理“>>()”

余鸿ley

在尝试输出重定向和进程替换时,我偶然发现了以下命令及其结果输出:

    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在后台执行进程替换。

  1. 主bash进程启动要执行的子shell sleep 1; cat,并为其建立管道。
  2. bash主进程执行echo foo由于这不会填满管道的缓冲区,因此该echo命令将终止而不会阻塞。
  3. bash主进程执行echo bar
  4. bash主进程启动命令sleep 2
  5. 同时,subshel​​l正在启动命令sleep 1
  6. 大约1秒钟后,sleep 1返回子流程。子流程继续执行cat
  7. cat 将其输入复制到其输出(显示在屏幕上)并返回。
  8. 子外壳已完成工作,然后退出。
  9. 再过一秒钟,sleep 2返回。主shell进程完成执行,您会看到下一个提示。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章