我想问这两个命令的区别(即只是它们的选项顺序不同):
tar -zxvf foo.tar.gz
tar -zfxv foo.tar.gz
第一个运行完美,但第二个说:
tar: You must specify one of the `-Acdtrux' or `--test-label' options
Try `tar --help' or `tar --usage' for more information.
并焦油--test-label
并-zfxv
说:
tar (child): xv: Cannot open: No such file or directory
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now
然后我查看了 tar 手册,发现所有的例子-f
最后都使用了 switch!
AFAICT 不需要这个限制,或者有吗?!因为在我看来开关应该是免费的。
答案1
开关的顺序是自由的,但-f
有一个强制参数,即tar
要读/写的文件。
你可以做
tar -zf foo.tar.gz -xv
这将起作用,并且满足您对非特定开关顺序的要求。
这就是所有具有带有参数的选项的命令的工作方式。
答案2
传统上,tar 的选项是或多或少“无顺序”(如果都指定了f
和b
选项的顺序确实很重要)。然而,使用前导破折号会导致 GNU tar 以一种与其他命令更一致的方式解析选项,其中指定需要参数的选项(例如 的文件名f
)将立即消耗“单词”的其余部分,如果有的话,作为参数(传统上,tar 使用下一个当指定f
或 时,word 作为文件名/块大小)。b
在您的情况下,它采用“xv”作为文件名。
但是,不能依赖此行为来实现可移植性。为了获得最大的可移植性,您应该避免使用破折号,始终放在最后,并且始终在文件名f
之间放置一个空格。不过,如果您需要该选项或通常需要参数以外的任何选项(例如) f
,这种简化就会失败。b
C
f
这记录在Tar 手册部分“三种选项样式”。一些其他实现(例如 FreeBSD)将旧样式选项称为“捆绑选项字”。当然,某些实现可能仅有的支持这种类型的选项,并且可能会也可能不会忽略破折号(如果包含的话)。这是单一 Unix 规范中指定的唯一调用形式,因此保证可以在几乎所有系统上工作。
答案3
查看您的错误消息,很明显您没有使用tar
而是gtar
.
一般来说,这可能有助于理解事情:
tar
通常总是需要一个文件参数。如果丢失,它将从系统默认的真实磁带设备读取/写入。star
在 1982 年对此进行了更改,默认使用 stdin/stdout,并且最近一些其他 tar 实现(例如 gtar)也遵循了此示例。tar
不实现在 tar 命令的情况下-
调用的选项的前导。为了方便用户,key letters
一些实现后来添加-
为无操作键字母,但您不能依赖于此。tar
解析其参数(特别是存档文件参数)的方式风险很高。我见过许多 tar 存档破坏了存档中应包含的文件之一,因为相关文件参数被视为 tar 存档文件。star
因此(如果本地称为star
)不允许“f”与其他选项连接。如果star
被调用,tar
它实现了与 的命令行兼容性tar
,但仍然以不同的方式处理“f”键字母的参数:仅当该参数引用真实设备文件或(在写入模式下)该文件尚不存在时才允许该参数。
我建议避免使用有风险的原始 tar 命令行,而使用star
.
由于 的命令行语法有问题,因此在 20 世纪 90 年代初tar
出现了所谓的。tar wars
结果,该计划pax
(拉丁语,焦油战争中的“和平”的意思)被创建并标准化。pax
然而它并没有受到欢迎,因为它的语法比 tar 语法风险更小,但也不太直观。另一个问题可能是gpax
或多或少没有得到维护。
答案4
在焦油中,-交换机中的 多年前已被弃用,不再需要。 Tar 实际上曾经告诉过你这一点,但现在不再这样做了。
ie:
tar zxvf foo.tar.gz
tar zfxv foo.tar.gz
Both of these work fine without the -.