Sta*_* Yu 9 shell bash concurrency process-substitution
在尝试输出重定向和进程替换时,我偶然发现了以下命令及其结果输出:
me@elem:~$ echo foo > >(cat); 回声条
酒吧
我@elem:~$ foo
(是的,最后那个空的换行符是故意的。)
所以 bash echo 的栏,打印我通常的提示,echo 的 foo,echo 是一个换行符,并将我的光标留在那里。如果我再次按回车键,它会在新行上打印我的提示并将光标留在后面(当有人在空命令行上按回车键时,正如预期的那样)。
我期待它将 foo 写入文件描述符,cat 读取它和 echo 的 foo,第二个 echo echo 的 bar,然后返回到命令提示符。但显然情况并非如此。
有人可以解释一下发生了什么吗?
您可能会看到在提示foo之前bar、之后bar甚至之后显示,具体取决于时间。添加一点延迟以获得一致的时间:
$ echo foo > >(sleep 1; cat); echo bar; sleep 2
bar
foo
$
Run Code Online (Sandbox Code Playgroud)
bar立即出现,然后foo在一秒后出现,然后在下一秒后出现下一个提示。
发生的事情是 bash 在后台执行进程替换。
sleep 1; cat,并设置一个管道到它。echo foo. 由于这不会填满管道的缓冲区,因此该echo命令将终止而不会阻塞。echo bar.sleep 2。sleep 1。sleep 1返回子进程。子进程继续执行cat。cat 将其输入复制到其输出(显示在屏幕上)并返回。sleep 2返回。主 shell 进程完成执行,您将看到下一个提示。| 归档时间: |
|
| 查看次数: |
614 次 |
| 最近记录: |