bash 重定向中的“-”如何工作?

bash 重定向中的“-”如何工作?

我之前在某处看到过这个解释,但现在找不到参考。 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读取文件foostdin

在 的情况下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)是来自管道的输入。卷曲的输出。

相关内容