Ram*_*esh 49 process pipe open-files process-substitution
我试图在这个特定示例的上下文中理解命名管道。
我输入<(ls -l)我的终端并得到输出,bash: /dev/fd/63: Permission denied.
如果我输入cat <(ls -l),我可以看到目录内容。如果我更换cat用echo,我觉得我得到的终端名称(或者是什么呢?)。
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]
Run Code Online (Sandbox Code Playgroud)
但是,如果我给出,ls -l <()它会列出目录内容。
在命名管道的情况下会发生什么?
cra*_*150 51
当你这样做时<(some_command),你的 shell 执行括号内的命令并用文件描述符替换整个内容,该文件描述符连接到命令的标准输出。/dev/fd/63包含 ls 调用输出的管道也是如此。
当你这样做时,<(ls -l)你会得到一个Permission denied错误,因为整行都被管道替换了,实际上试图/dev/fd/63作为一个命令调用,它是不可执行的。
在您的第二个示例中,cat <(ls -l)变为cat /dev/fd/63. 当 cat 从作为参数给出的文件中读取时,您将获得内容。echo另一方面,只是“按原样”输出其参数。
您拥有的最后一种情况<()只是被空无所取代,因为没有命令。但这在 shell 之间并不一致,在 zsh 中你仍然会得到一个管道(虽然是空的)。
摘要:
<(command)让您使用命令的输出,您通常需要一个文件。
编辑:正如Gilles指出的那样,这不是命名管道,而是匿名管道。主要区别在于,它只存在,只要进程正在运行,而命名管道(例如创建mkfifo)将保持不附加进程。
| 归档时间: |
|
| 查看次数: |
32476 次 |
| 最近记录: |