两个管道到一个命令

ibl*_*lue 10 shell bash

我对以下语法有点困惑。虽然它有效,但它不明白为什么它有效。似乎有两个管道连接到 diff 命令。但不是只有一个STDIN吗?

例子:

diff <(echo "foobar") <(echo "barbaz")
diff <(cat foo.txt) <(cat bar.txt)
Run Code Online (Sandbox Code Playgroud)

Sve*_*ach 14

管道只是绑定到与 0 (stdin) 不同的文件描述符:

$ echo <(true)
/dev/fd/63
$ echo <(true) <(true)
/dev/fd/63 /dev/fd/62
Run Code Online (Sandbox Code Playgroud)

一个进程当然可以一次有多个打开的文件描述符,所以没有问题。

  • @WilliamPursell:不涉及任何文件。shell 使用“pipe()”创建一个匿名管道,然后派生子进程。如果使用匿名管道,主进程*确实*会打开其他文件描述符。这些额外的文件描述符以`/dev/fd/...` 的形式传递,进程通常会使用这些文件名简单地打开它们。这将导致它们被 `dup()` 处理,创建更多打开的文件描述符。该进程还可以立即使用命名的文件描述符,而无需任何打开调用... (2认同)