我之前在某处看到过这个解释,但现在找不到参考。 Ubuntu docker 入门指南中的示例用法:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
我什至模糊地记得它应该做什么。 IIRC 正确,它应该以某种方式使用通过管道传递的标准输入。但为什么在这种情况下这是必要的呢?
我最接近的发现是在这篇文章中:http://www.catonmat.net/blog/bash-one-liners-explained-part- Three/。也许,它与关闭流有关,就像在打开非标准流然后关闭它的示例中一样?
exec 3<file
exec 3>&-
答案1
它不是 Bash 或任何 shell 的功能,而是许多应用程序中明确告诉它们从stdin
.当然,stdin
如果没有提到其他文件,许多程序都会读取,但即使在这种情况下,您也需要能够明确指定stdin
是否希望将其与其他文件一起处理。例如,cat foo -
已cat
读取文件foo
和stdin
。
在 的情况下apt-key
,手册页意味着为add
子命令提供文件名是强制性的,并且-
必须指定为使用stdin
.请记住,这取决于应用程序执行它想要的操作,并读取它想要的任何输入;没有任何东西需要任何程序来读取stdin
。使用它作为默认输入源只是一种习惯。
有些程序不支持-
as Meaning stdin
,而是将其视为文字文件名。在这些情况下,像这样的解决方法/dev/stdin
是必要的。
至于>&-
,我看不出它们会显式连接。这可能只是一个简单字符的偶然使用。破折号>&-
可能来自与表示“无”(空字段)的罢工的连接。为什么用这个意思stdin
,我不知道。但它看起来比或这样更好%
,并且许多其他字符具有其他含义。
答案2
这个-
参数通常(对于某些命令)意味着“stdin 输入”。
因此,这个命令管道(两个命令用 分隔|
):
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
使用-
告诉 apt-key 从标准输入读取。
该输入(stdin)是来自管道的输入。卷曲的输出。