两个管道到一个命令


9

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

例子:

diff <(echo "foobar") <(echo "barbaz")
diff <(cat foo.txt) <(cat bar.txt)

下面是相关topic--链接进程替换 ----在bash手册页。
chepner

Answers:


13

管道仅绑定到不同于0(stdin)的不同文件描述符:

$ echo <(true)
/dev/fd/63
$ echo <(true) <(true)
/dev/fd/63 /dev/fd/62

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


如果我只知道它称为临时管道,那我将能够对其进行谷歌搜索。谢谢!

@iblue:我不认为它被称为“临时管道”。它只是pipe()系统调用创建的管道。
Sven Marnach 2012年

确切地说,它可能被称为“匿名命名管道”,但是用Google搜索它就足够了。

2
@WilliamPursell:没有文件。外壳程序使用创建一个匿名管道pipe(),然后派生子进程。如果使用匿名管道,则主进程的确会打开其他文件描述符。这些额外的文件描述符以形式传递/dev/fd/...,该过程通常会简单地使用这些文件名打开它们。这将导致它们被dup()ed,从而创建更多的打开文件描述符。该过程还可以立即使用命名的文件描述符,而无需任何打开的调用……
Sven Marnach 2012年

1
...在这个小而愚蠢的测试程序中得到了证明。编译为之后a,我将其称为./a <(ls),并成功打印了文件列表,证明已命名的文件decriptor(在我的情况下为63)已经打开。bash可能在与Linux不同的体系结构上的临时目录中使用命名管道,在这种情况下,进入主进程时不会打开其他文件描述符。
Sven Marnach 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.