bash 如何对待“> >()”

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,然后返回到命令提示符。但显然情况并非如此。

有人可以解释一下发生了什么吗?

Gil*_*il' 9

您可能会看到在提示foo之前bar、之后bar甚至之后显示,具体取决于时间。添加一点延迟以获得一致的时间:

$ echo foo > >(sleep 1; cat); echo bar; sleep 2 
bar
foo
$
Run Code Online (Sandbox Code Playgroud)

bar立即出现,然后foo在一秒后出现,然后在下一秒后出现下一个提示。

发生的事情是 bash 在后台执行进程替换。

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