tar 及其关键字母:这是错误还是功能?

tar 及其关键字母:这是错误还是功能?

我想问这两个命令的区别(即只是它们的选项顺序不同):

  1. tar -zxvf foo.tar.gz
  2. 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 的选项或多或少“无顺序”(如果都指定了fb选项的顺序确实很重要)。然而,使用前导破折号会导致 GNU tar 以一种与其他命令更一致的方式解析选项,其中指定需要参数的选项(例如 的文件名f)将立即消耗“单词”的其余部分,如果有的话,作为参数(传统上,tar 使用下一个当指定f或 时,word 作为文件名/块大小)。b在您的情况下,它采用“xv”作为文件名。

但是,不能依赖此行为来实现可移植性。为了获得最大的可移植性,您应该避免使用破折号,始终放在最后,并且始终在文件名f之间放置一个空格。不过,如果您需要该选项或通常需要参数以外的任何选项(例如) f,这种简化就会失败。bCf

这记录在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 -.

相关内容