命令末尾的破折号“-”是什么意思?

Eug*_*e S 94 shell filenames

给出以下命令:

gzip -dc /cdrom/cdrom0/file.tar.gz | tar xvf –
Run Code Online (Sandbox Code Playgroud)

什么是-在命令中到底意味着什么?它是某种占位符吗?

Ale*_*ios 100

在这种情况下,它的意思是“标准输入”。tar当需要文件参数并且您需要改用 stdin 时,某些软件(例如)会使用它。它不是 shell 构造,它取决于您使用的程序。如果有疑问,请查看联机帮助页!

在这种情况下,标准输入是-f选项的参数。在-不支持的情况下,您可以使用类似tar xvf /proc/self/fd/0or 的东西tar xvf /dev/stdin(后者在各种 unice 中得到广泛支持)。

不要依赖这个来表示普遍的“标准输入”。由于它不是由 shell 解释的,所以每个程序都可以随意处理它。在某些情况下,它是标准输出或完全不同的东西:su它表示“启动登录外壳”。在其他情况下,它根本不被解释。肌肉记忆让我创建了很多命名的文件,-因为我习惯的某个程序的某些版本不理解破折号。

  • 如果你真的想要一个输入/输出流,可以使用 `/dev/stdin` 或 `/dev/stdout`。请注意,它是一个流,想要在文件中查找的程序可能无法正常使用它,就像使用 `-`(例如 ffmpeg) (6认同)
  • 我不相信是这样。首先,`cat` 处理`-`(查看手册页)。`cat` 的内置 shell 版本可能会也可能不会,但这并不是严格意义上的整个 shell。另外,如果 shell 处理了 `-`,你可以说 echo `-`,它会扩展到别的东西。相反,它只是回应一个破折号(不是`/dev/stdin` 或`/proc/self/fd/0`)。而 `echo test > -` 只是创建了一个名为 `-` 的文件,所以它显然也不会在那里处理它。哦,你列出的页面并没有说它是由 *shell* 处理的,它说你可以将它与 `cat` 和 `diff` 一起使用,这两者都明确地理解破折号。 (5认同)
  • 根据上下文,它也可以表示 `STDOUT`。 (4认同)
  • 几乎所有其他事情,因为这取决于个人程序来解释。 (3认同)
  • 在`bash`的情况下,连字符*是*由shell解释的。请参阅 [Advanced Bash-Scripting Guide - Chapter 3. Special Characters](http://tldp.org/LDP/abs/html/special-chars.html),然后搜索文本 [dash] 或“redirection from/到标准输入或标准输出”。使用`bash`,您可以在大多数需要文件名的地方使用连字符。这是对 < | 的明显补充 > 恕我直言 (3认同)

Kon*_*lph 15

在这种情况下,-假设您正在运行 Linux,实际上非常无用:

GNU tar(Linux 上的版本)默认接受来自标准输入的输入。如果您想要这种行为,并且想要将文件名作为命令行参数传递,那么您需要指定标志f

tar xf filename
Run Code Online (Sandbox Code Playgroud)

所以这与

tar x < filename
Run Code Online (Sandbox Code Playgroud)

或者,如果输入像您的示例一样被压缩:

gzip -dc filename | tar x
Run Code Online (Sandbox Code Playgroud)

f这里指定标志根本没有意义,但是因为它被指定了,所以需要给出文件名-以表明我们要从标准输入中读取(参见其他答案)。所以,重复一遍,这是多余的,而且有点奇怪。

此外,可以简化上面的行,因为可以gzip通过指定z标志告诉 GNU tar 通过自身流式传输输入:

tar xfz filename
Run Code Online (Sandbox Code Playgroud)

– 无需gzip显式调用。

  • 由于历史原因,除 Linux 之外的大多数操作系统都将 `tar` 默认为第一个磁带驱动器。 (2认同)