此卷曲/焦油示例中裸破折号的含义

此卷曲/焦油示例中裸破折号的含义

我知道从这个答案各种 Unix 实用程序使用裸破折号来指定用户想要使用 stdin 或 stdout 而不是常规文件。

然而,这并不能完全帮助我理解以下语法(我从 Heroku 构建包中获取它,该构建包基本上在目录中安装了 Perl 的副本)。总体而言,正在从 $PERL_PACKAGE 处的 URL 下载 Perl 并通过管道传送到 tar,后者将其解压到目录 $VENDORED_PERL

curl $PERL_PACKAGE -s -o - | tar xzf - -C $VENDORED_PERL

但细节有点令人困惑。 -o 用于指定输出文件反而stdout 的,所以我不明白为什么你要使用该选项,然后使用破折号,而不是根本不使用该选项。

至于 tar,我猜 - 是告诉它不要使用输入文件,因为它从管道接收输入?

也许我缺少管道工作方式的一些要求。

答案1

f -也表示“从标准输入读取”/“写入标准输出” tar。但默认的源/目标可能因tar版本和实现而异,因此将其添加到命令中似乎更安全。

如果-o -不需要,curl那么该命令的作者可能不知道这一点,或者认为通过这些明确的信息该命令更容易理解。

答案2

我不认为你错过了什么。您提到的选项在我近年来使用的所有 shell 和实现curl中都是不必要的。tar

我会这样写该行:

curl "$PERL_PACKAGE" -s | tar xz -C "$VENDORED_PERL"

也就是说,没有不必要的文件名选项,并且对用作命令行参数的变量使用保守的双引号。

他们为什么要这样写?可能是老习惯了。或者一些旧系统、旧实现,这些参数曾经是必需的。由于脚本按原样运行,因此无需“修复”任何内容。

相关内容