参数顺序与 tar 有关系吗?

Bit*_*Bug 20 linux tar parameter

我正在学习 Linux。我很惊讶地看到参数顺序在制作 tarball 时似乎很重要。

tar -cfvz casual.tar.gz snapback.txt bucket.txt
Run Code Online (Sandbox Code Playgroud)

给出错误:

tar: casual.tar.gz: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
Run Code Online (Sandbox Code Playgroud)

但是如果我发出这样的命令:

tar -cvzf casual.tar.gz snapback.txt bucket.txt
Run Code Online (Sandbox Code Playgroud)

tarball 的创建没有错误

谁能向我解释为什么参数顺序在这个例子中很重要,或者我可以在哪里找到这些信息来了解为什么?我按照我在第一个示例中所做的方式进行了尝试,该示例收到了一个错误,即首先放置所需参数 c 和 f 的逻辑,然后是我的其他参数。

我想完全吸收 Linux,包括理解为什么会发生这样的事情。提前致谢!

Mik*_*kel 33

顺序是否重要取决于您是否以减号开始选项

$ tar -cfvz casual.tar.gz snapback.txt bucket.txt
tar: casual.tar.gz: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors

$ tar cfvz casual.tar.gz snapback.txt bucket.txt
snapback.txt
bucket.txt
Run Code Online (Sandbox Code Playgroud)

这种不寻常的行为记录在手册页中

 Options to GNU tar can be given in three different styles.
 In traditional style
 ...
 Any command line words that remain after all options has
 been processed are treated as non-optional arguments: file or archive
 member names.
 ...
 tar cfv a.tar /etc
 ...
 In UNIX or short-option style, each option letter is prefixed with a
 single dash, as in other command line utilities.  If an option takes
 argument, the argument follows it, either as a separate command line
 word, or immediately following the option.
 ...
 tar -cvf a.tar /etc
 ...
 In GNU or long-option style, each option begins with two dashes and
 has a meaningful name
 ...
 tar --create --file a.tar --verbose /etc
Run Code Online (Sandbox Code Playgroud)

tar,它是“tape archive”的缩写,在当前约定确定之前就已经存在,因此它保留了不同的兼容性模式。

因此,要“吸收 Linux”,我建议您学习一些入门课程:

  • 总是阅读手册页
  • 语法上的细微差别有时很重要
    • 项目的位置 - 大多数命令要求选项是命令名称之后的第一件事
    • 是否需要减号(例如tarps根据开头是否有减号而不同)
    • 空格是可选的、必需的还是必须不存在(xargs -ifoo与 不同xargs -i foo
  • 有些事情并不像你期望的那样工作

要以通常的样式获得您想要的行为,请将输出文件名直接放在for 之后-f,例如

$ tar -cvzf casual.tar.gz snapback.txt bucket.txt
snapback.txt
bucket.txt
Run Code Online (Sandbox Code Playgroud)

或者:

$ tar -c -f casual.tar.gz -z -v snapback.txt bucket.txt
Run Code Online (Sandbox Code Playgroud)

或者您可以使用不太常见但更易于阅读的 GNU 长样式:

$ tar --create --verbose -gzip --file casual.tar.gz snapback.txt bucket.txt
Run Code Online (Sandbox Code Playgroud)


Kir*_*ira 8

检查-ftar 手册页中的选项给我们:

 -f, --file ARCHIVE
       use archive file or device ARCHIVE
Run Code Online (Sandbox Code Playgroud)

这意味着-f选项后面的下一个单词将是文件名。在您的示例中,-f它跟在字母之后vz,将用作文件名。

之后它将每个参数解析为它的输入以压缩到现在称为vz. 当它尝试这样做时,会tar注意到没有casual.tar.gz要压缩的名称的文件,然后它会给出您的错误。

因此,在 之后-f,它必须始终跟在您要生成的文件的名称之后。

  • 但请注意,这种不需要破折号前缀的可能性是 `tar` 的特殊性,大多数 unix 工具都不允许这样做。 (4认同)
  • @BitBug 在最常见的调用约定中,是的,将 `f` 作为选项块中的最后一个字母。 (2认同)