tar 的参数顺序重要吗?

tar 的参数顺序重要吗?

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

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 -cvzf casual.tar.gz snapback.txt bucket.txt

tarball 已创建且没有错误

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

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

答案1

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

$ 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

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

 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

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

因此,为了“吸收 Linux”,我建议一些入门课程:

  • 总是阅读手册页
  • 语法上的微小差异有时很重要
    • 项目的位置 - 大多数命令要求选项位于命令名称之后的第一个内容
    • 是否需要减号(例如tarps根据开头是否有减号而工作不同)
    • 空格是可选的、必需的还是不能存在(xargs -ifoo与 不同xargs -i foo
  • 有些事情并没有按照你期望的方式进行

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

$ tar -cvzf casual.tar.gz snapback.txt bucket.txt
snapback.txt
bucket.txt

或者:

$ tar -c -f casual.tar.gz -z -v snapback.txt bucket.txt

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

$ tar --create --verbose -gzip --file casual.tar.gz snapback.txt bucket.txt

答案2

检查-ftar 手册页中的选项为我们提供:

 -f, --file ARCHIVE
       use archive file or device ARCHIVE

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

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

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

相关内容