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


78

给出以下命令:

gzip -dc /cdrom/cdrom0/file.tar.gz | tar xvf 

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


3
-需要提及的一个小细节:不需要在命令末尾。例如:ls -l | diff - /old_ls_output.txt
manatwork'7

Answers:


82

在这种情况下,它表示“标准输入”。tar当需要文件参数而您需要使用stdin时,某些软件(例如)会使用它。它不是shell构造,它取决于您使用的程序。如有疑问,请查看手册页!

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

不要以此为普遍含义的“标准输入”。由于它不是由外壳程序解释的,因此每个程序都可以随意处理它。在某些情况下,它是标准输出或完全不同的输出su它表示“启动登录Shell”。在其他情况下,根本不会解释它。肌肉记忆使我创建了很多文件,它们的名称-是因为我以前不理解破折号的某些程序版本。


4
STDOUT根据上下文,它也可以表示。
bahamat 2012年

3
以及几乎所有其他内容,这取决于各个程序的解释。
Alexios 2012年

5
/dev/stdin/dev/stdout在您确实需要输入/输出流时使用。请注意,这是一个流,想要在文件中查找的程序可能无法正常工作-(例如ffmpeg)
Lekensteyn 2012年

3
在的情况下bash,连字符由shell解释。请参阅《高级Bash脚本指南》第3章。特殊字符,然后搜索文本[破折号]或“从/到stdin或stdout的重定向”。使用bash连字符可以在大多数需要文件名的地方使用连字符。这是对<|的明显补充。> IMHO
bsd

4
我不认为是这种情况。首先,cat处理-(检查联机帮助页)。shell内置的版本cat可能会或可能不会,但严格来说,这并不是整个shell。另外,如果shell处理了-,您可以说echo -,它将扩展为其他内容。相反,它只是显示一个破折号(不是/dev/stdin/proc/self/fd/0)。并且echo test > -仅创建一个名为的文件-,因此它显然也不会在该文件中进行处理。哦,您列出的页面并没有说它是由shell处理的,而是说您可以将其与cat和一起使用diff,两者都明确理解破折号。
Alexios

13

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

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

tar xf filename

所以这和

tar x < filename

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

gzip -dc filename | tar x

f这里完全指定该标志没有意义,但是由于已指定该标志,因此需要提供文件名-以指示我们要从标准输入中读取(请参阅其他答案)。因此,重复一遍,这是多余的并且有点奇怪。

此外,可以简化上述行,因为可以gzip通过指定z标志来告知GNU tar通过自身流式处理输入:

tar xfz filename

–无需gzip明确呼叫。


1
注意:并非每个人tar都有z选择。
liori 2012年

2
tar由于历史原因,除Linux以外的大多数操作系统都默认使用第一个磁带机。
Gilles 2012年

1
@Gilles BSD,以及 OS X,……。但是我很好奇:除了一些旧的大型机外,还有哪些系统仍使用这种版本(除了大型机之外,还有哪些系统甚至具有磁带机)?
康拉德·鲁道夫2012年

1
@KonradRudolph所有三个主要的BSD默认都使用磁带驱动器(/dev/sa0在FreeBSD 9.0,/dev/rst0NetBSD 6.0和OpenBSD 5.1上)。AIX 7.1的缺省值为/dev/rmt0。MINIX3默认为/dev/sa0。(我分别检查了最新的OS版本,它们不是“旧的大型机”。)Solaris可以通过中的文件进行配置/etc,我认为默认为磁带驱动器。GNU tar,Schilling tar,OSX和BusyBox默认为stdin / stdout。
吉尔斯

1
@Gilles- 出于明显的原因,我tar将默认状态下的第二个磁带驱动器重新编译。:)
David Harkness 2012年
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.