Answers:
在这种情况下,它表示“标准输入”。tar
当需要文件参数而您需要使用stdin时,某些软件(例如)会使用它。它不是shell构造,它取决于您使用的程序。如有疑问,请查看手册页!
在这种情况下,标准输入是-f
选项的参数。在-
不支持的情况下,您可以使用诸如tar xvf /proc/self/fd/0
或tar xvf /dev/stdin
(在各种unice中得到广泛支持)之类的东西。
不要以此为普遍含义的“标准输入”。由于它不是由外壳程序解释的,因此每个程序都可以随意处理它。在某些情况下,它是标准输出或完全不同的输出:su
它表示“启动登录Shell”。在其他情况下,根本不会解释它。肌肉记忆使我创建了很多文件,它们的名称-
是因为我以前不理解破折号的某些程序版本。
STDOUT
根据上下文,它也可以表示。
/dev/stdin
或/dev/stdout
在您确实需要输入/输出流时使用。请注意,这是一个流,想要在文件中查找的程序可能无法正常工作-
(例如ffmpeg)
bash
,连字符是由shell解释。请参阅《高级Bash脚本指南》第3章。特殊字符,然后搜索文本[破折号]或“从/到stdin或stdout的重定向”。使用bash
连字符可以在大多数需要文件名的地方使用连字符。这是对<|的明显补充。> IMHO
cat
处理-
(检查联机帮助页)。shell内置的版本cat
可能会或可能不会,但严格来说,这并不是整个shell。另外,如果shell处理了-
,您可以说echo -
,它将扩展为其他内容。相反,它只是显示一个破折号(不是/dev/stdin
或/proc/self/fd/0
)。并且echo test > -
仅创建一个名为的文件-
,因此它显然也不会在该文件中进行处理。哦,您列出的页面并没有说它是由shell处理的,而是说您可以将其与cat
和一起使用diff
,两者都明确理解破折号。
在这种情况下,-
假设您正在运行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
明确呼叫。
tar
都有z
选择。
tar
由于历史原因,除Linux以外的大多数操作系统都默认使用第一个磁带机。
/dev/sa0
在FreeBSD 9.0,/dev/rst0
NetBSD 6.0和OpenBSD 5.1上)。AIX 7.1的缺省值为/dev/rmt0
。MINIX3默认为/dev/sa0
。(我分别检查了最新的OS版本,它们不是“旧的大型机”。)Solaris可以通过中的文件进行配置/etc
,我认为默认为磁带驱动器。GNU tar,Schilling tar,OSX和BusyBox默认为stdin / stdout。
tar
将默认状态下的第二个磁带驱动器重新编译。:)
-
需要提及的一个小细节:不需要在命令末尾。例如:ls -l | diff - /old_ls_output.txt
。