连字符“-”在“ tar xzf-”中是什么意思?


23

当尝试从命令行安装Dropbox时,我阅读了命令

cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf -

-是什么 意思?是以前的目录吗?


9
有点学究:您要询问的选项是f -。这可能会使在手册页中找到答案更加容易。
studog

4
这将是非常有益的,如果你能说明什么,恰恰是不清楚你有关的文件wgettar。这样,各个开发人员就可以改善其文档,以便将来的用户不会再遇到相同的问题。换句话说:成为英雄,让世界更美好!
约尔格W¯¯米塔格

2
tar使用stdin是一个很好的默认设置,但是因为它的传统是使用磁带,所以它没有这样做。相反,它学会了如何使用文件(使用f选项),然后遵循约定以-代替stdin的文件名(如果使用eXtract或如果创建则使用stdout)
eckes

1
@eckes对于GNU tar,除非已设置,否则stdin 默认$TAPE设置。
克莱里斯

Answers:


42

一些命令-代替文件名接受:

  • 写到标准输出而不是命名文件。这就是之后-传递给参数的内容。wget-O
  • 标准输入而不是命名文件读取。这是什么-参数传递给tarxzf

您显示的命令使用下载文件,wget并使用解压缩文件tar。为了实现这一点,输出wgetIS 管道|)到的输入tar。这就是为什么wget写入标准输出而不是文件,并tar读取标准输入而不是文件的原因。


我会说“大多数命令”,而不仅仅是“某些命令”。我相信它是POSIX选项语法规范的一部分。
巴尔马尔

2
@Barmar是和否:准则13:对于使用操作数表示要打开以进行读取或写入操作的文件的实用程序,应使用'-'操作数来表示仅标准输入(或从上下文中可以清楚地看到的标准输出)。正在指定输出文件)或名为的文件-。因此,如果 -是“文件选项”的操作数并且具有特殊含义,它必须是stdin / stdout。该程序可以免费使用,不要将其视为特殊情况,而只是查找文件-
Bakuriu

(通常情况下,忽略该选项将与使用相同-
Bakuriu

@Bakuriu我不明白这是如何反驳我说的。我怀疑大多数命令都使用文件名参数,因此应该遵循该准则。但是也许我应该把它定义为“大多数对文件进行操作的命令”。
Barmar

1
@Barmar遵循准则的一种方法是完全拒绝-特殊对待,将其视为文字文件名。违背指南的唯一方法是-特别对待,但其含义不同于指南所建议的含义。
埃利亚·卡根

12

那只是一个文件名,许多Unix程序都将其解释为“而不是实际打开文件,读取stdin(或写入stdout)文件”。

这意味着从流进程序的输入中读取内容。在您的情况下,这就是wget的输出。


6
确实是文件名吗?
Eric Duminil

7
@EricDuminil从某种意义上来说,它是文件名,程序会在某些地方接受它们,否则它们将只接受文件名,但是您说对了,它实际上并不是某个目录中文件的实际名称。
JoL

5
@EricDuminil:特别是对于遵循此约定的程序,./-如果实际上要打开名为的文件,则必须使用-
约尔格W¯¯米塔格

4
@EricDuminil实际上:是的!它命名一个文件 ; 在Unix的意义上,stdin是文件描述符,并且-是您提供使用的名称。从操作系统的角度来看,它不是文件名。仅从用户角度来看。
MarcusMüller

3
@rexkogitans不。/dev/stdin只是某些内核工具提供的便捷文件名。当您编写选择使用stdin的程序时,通常在任何 fopen("/dev/stdin", "r")地方都不会发生任何事情。您只需继续使用extern FILE* stdinlibc标头提供的即可;顺便说一下,这就是整数文件描述符0
MarcusMüller

5

-参数tar指定的存档要从中读取stdin,而不是一个文件。从GNU tar手册中

如果-用作档案名称tar则从标准输入中读取档案(列出或提取文件时)

其他命令具有相同的行为,并且由POSIX.1-2017标准指定:

准则13

对于使用操作数表示要打开以进行读取或写入操作的文件的实用程序,“' -”操作数应仅用于表示标准输入(或在上下文中明确指定了输出文件时表示标准输出)或文件命名-

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.