为什么进程替换会导致一个名为/ dev / fd / 63的文件,这是一个管道?


40

我试图在此特定示例的上下文中了解命名管道。

我输入<(ls -l)我的终端,并输出为bash: /dev/fd/63: Permission denied

如果输入cat <(ls -l),我可以看到目录内容。如果我更换catecho,我觉得我得到的终端名称(或者是什么呢?)。

echo <(ls -l)将输出给出为/dev/fd/63

另外,这个示例输出对我来说还不清楚。

ls -l <(echo "Whatever")
lr-x------ 1 root root 64 Sep 17 13:18 /dev/fd/63 -> pipe:[48078752]

但是,如果我给出,ls -l <()它将列出目录内容。

如果命名管道发生了什么情况?

Answers:


37

当您这样做时<(some_command),您的外壳程序会在括号内执行命令,并用连接到命令标准输出的文件描述符替换整个内容。/dev/fd/63包含ls调用输出的管道也是如此。

当您<(ls -l)收到Permission denied错误消息时,因为整个行都被管道替换,实际上试图/dev/fd/63作为不可执行的命令进行调用。

在第二个示例中,cat <(ls -l)变为cat /dev/fd/63。当cat从作为参数给出的文件中读取时,您将获得内容。echo另一方面,仅按“原样”输出其参数。

您没有的最后一种情况<()就被什么都替换了,因为没有命令。但这在外壳程序之间并不一致,在zsh中您仍然得到一个管道(尽管为空)。

摘要<(command)允许您使用命令的输出,而通常在该位置需要文件。

编辑:正如吉尔斯指出的,这不是命名管道,而是匿名管道。主要区别在于,只有在进程正在运行时它才存在,而命名管道(例如使用创建的管道mkfifo)将保留而不附加任何进程。


5
mkfifo仅创建命名管道,不包含任何内容。因此,您需要自己写信(例如mkfifo mypipe; ls > mypipe)。是的,对管道的写入将阻塞,直到从管道读取某些进程为止。
crater2150 2014年

6
这里没有命名管道。/dev/fd/63是一个匿名管道。
吉尔(Gilles)“所以

1
@ crater2150,@ Gilles / dev / fd / 63确实是一个命名管道。用类似的东西检查一下file <(ls)。Shell确实会创建一个匿名管道,但是文件描述符在中反映为命名管道/dev/fd。如果它是匿名管道,则它将没有名称,并且无法/dev/fd/63通过传递给它的命令来打开。
rv

2
@rv仍然是一个匿名管道。有一个文件名引用了这个匿名管道这一事实并没有使它成为一个命名管道:一个命名管道是不同的,它存在于文件系统的某个地方,具有权限和所有权等。的条目/dev/fd可以引用任何文件描述符,甚至匿名管道插座,网络套接字,共享存储器段等
吉尔“SO-停止尚且”

1
为什么是63呢?
K3 --- rnc

-4

您会误解ls命令和重定向。ls列出了命令行中给定的文件和目录,我不认为它接受来自stdin的任何输入。重定向> >><是使用文件提供输入和收集输出的方法。


1
这里没有文件重定向。<(…)是一个流程替代。
吉尔斯(Gillles)“所以-别再作恶了”

1
@IMSoP-正如Gilles所说-它不是命名管道-是匿名管道。它x|y[num]<<REDIRECT某些shell 几乎相同并且几乎相同。区别在于,shell用fd链接按字面替换- /dev/fd/63等等,以及它用stdin做或不做的事情。这样做echo | readlink /dev/fd/0,看看自己。
mikeserv

1
@IMSoP-这是一个dev链接-一个特殊文件。您可以在大多数linux系统上执行相同的w /任何文件描述符-甚至是典型的|pipes,尽管我不保证其他地方的行为。我知道您来自哪里,但是命名管道本身并不是一件单独的事情-它是对内核管道的文件系统引用- 常规文件系统引用,而不是设备文件。
mikeserv

1
@mikeserv有趣的是,Bash手册提到它将在系统上运行,而无需/dev/fd/*在其他地方创建命名管道。但是我认为/dev/fd/*它本身是与命名管道本身不同的机制。顺便说一句,维基百科的描述可以解释这种区别。
IMSoP

1
@mikeserv根据我发现的其他参考文献,它比这更简单:如果/dev/fd/*不可用,bash将在中创建一个命名管道/tmp,并将其用于进程替换。对我来说似乎并不奇怪,只是使功能在尽可能多的环境中可用。
IMSoP 2014年
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.