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

Abs*_*cDo 23 command-line tar

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

cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf -
Run Code Online (Sandbox Code Playgroud)

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

Eli*_*gan 42

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

  • 写入标准输出而不是写入命名文件。这就是-传递给wgetafter的参数-O所做的。
  • 标准输入而不是从命名文件中读取。这就是-参数在tar之后传递的内容xzf

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

  • @Barmar 是和否:[指南 13:对于使用操作数来表示要打开以进行读取或写入的文件的实用程序,'-' 操作数应仅用于表示标准输入(或从上下文中明确的标准输出)指定输出文件)**或名为`-`.**](https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html)的文件。所以**if** `-` 是一个“文件选项”的操作数*并且*它有一个特殊的含义,*那么*它必须是stdin/stdout的。该程序可以自由地不将其视为特殊情况而只需查找文件`-` (3认同)

Mar*_*ler 12

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

这意味着从流入程序的输入中读取;在你的情况下,那是 wget 的输出。

  • @EricDuminil 这是一个文件名,因为程序在某些地方接受它,否则他们只会接受文件名,但你是对的,它并不是真正关于某个目录中文件的实际名称。 (7认同)
  • 不过,它真的是*文件名*吗? (6认同)
  • @EricDuminil:特别是,对于遵循此约定的程序,如果您*实际上*要打开名为“-”的文件,则必须使用“./-”。 (5认同)
  • @EricDuminil 事实上:是的!它*命名*一个*文件*;在 unix 意义上,`stdin` 是一个文件描述符,而 `-` 是你提供的名称来使用它。不过,从操作系统的角度来看,它不是文件名。仅从用户角度。 (4认同)
  • @rexkogitans 没有。`/dev/stdin` 只是一些内核工具提供的一个方便的文件名。当您编写选择使用 stdin 的程序时,通常在任何地方都会发生 **no** `fopen("/dev/stdin", "r")`;您只需继续使用您的 libc 标头为您提供的`extern FILE* stdin`;顺便说一下,这是整数文件描述符“0”。 (3认同)

小智 5

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

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

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

准则 13

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