我从这个 SO 答案中知道,各种 Unix 实用程序使用裸破折号来指定用户想要使用标准输入或标准输出而不是常规文件。
但是,这并不能帮助我理解以下的语法(我从 Heroku buildpack 中获取,它基本上在目录中安装了 Perl 的副本)。总的来说,正在发生的事情是 Perl 正在从 $PERL_PACKAGE 的 URL 下载并通过管道传输到 tar,然后将其提取到目录 $VENDORED_PERL
curl $PERL_PACKAGE -s -o - | tar xzf - -C $VENDORED_PERL
但是细节有点混乱。-o 用于指定输出文件而不是标准输出,所以我不明白为什么要使用该选项,然后使用破折号,而不是根本不使用该选项。
至于 tar,我猜 - 告诉它不要使用输入文件,因为它正在接收来自管道的输入?
也许我错过了管道如何工作的一些要求。
我不认为你缺少任何东西。你提到的选项在我近年来使用的所有 shell 和实现中
curl
都是不必要的。tar
我会这样写那一行:
也就是说,没有不必要的文件名选项,并且对用作命令行参数的变量进行了保守的双引号。
他们为什么要这样写?可能是旧习惯。或者一些旧系统,旧实现,这些参数过去是必需的。而且由于脚本按原样运行,因此无需“修复”。
f -
也表示“从标准输入读取”/“写入标准输出”tar
。但是默认源/目标可能因tar
版本和实现而异,因此将其添加到命令中似乎更安全。如果
-o -
不需要,curl
则该命令的作者可能不知道这一点,或者认为使用此明确信息更容易理解该命令。