为什么特定的选项顺序对 tar 命令很重要?

Edw*_*lds 7 tar options

我正在尝试tar使用.tar扩展名制作存档的命令。

请查看我尝试过的以下一系列命令:

$ ls
abc.jpg  hello.jpg  xjf.jpg
$ tar -cfv test.tar *.jpg
tar: test.tar: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
$ ls
abc.jpg  hello.jpg  v  xjf.jpg
$ rm v
$ ls
abc.jpg  hello.jpg  xjf.jpg
$ tar -cvf test.tar *.jpg
abc.jpg
hello.jpg
xjf.jpg
$ ls
abc.jpg  hello.jpg  test.tar  xjf.jpg
Run Code Online (Sandbox Code Playgroud)

为什么它会用不同的选项序列给出不同的响应?即-cfvvs cvf
从我在 bash 脚本中学到的,选项序列并不重要。

ter*_*don 11

正如@jcbermu 所说,对于大多数程序和大多数情况,命令行标志的顺序并不重要。但是,某些标志需要一个值。具体来说,tar 的-f标志是:

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

因此,tar期望-f有一个值,该值将是它创建的 tarfile 的名称。例如,要将所有.jpg文件添加到名为 的存档中foo.tar,您将运行

tar -f foo.tar *jpg
Run Code Online (Sandbox Code Playgroud)

你正在运行的是

tar -cfv test.tar *.jpg
Run Code Online (Sandbox Code Playgroud)

tar理解为“创造(-c)称为存档v-fv),包含文件test.tar和任何结束.jpg

tar -cvf test.tar *.jpg另一方面,当您运行时,它将test.tar作为存档的名称和*jpg文件列表。


jcb*_*rmu 9

只要选项不需要值,顺序就无关紧要。在您的情况下-f需要指定文件名。

在第一种情况下(tar -cfv),该命令认为输出文件名是 v 因为在-f之后。


Ran*_*832 5

虽然其他人指出它将它视为-c -f v,但我觉得我应该注意这只是因为使用了破折号,并且这种行为并不适用于所有版本的 tar。在传统模式(无破折号)中,tar 会特别对待第一个参数,其中的“f”或“b”将消耗选项(so或)之后的下一个完整单词。对于 GNU tar,您可以通过运行在完整的 Texinfo 文档中找到更多详细信息。tar cfb file.tar 20tar cbf 20 file.tarinfo tar styles

通常,您不应依赖任何一种行为,并且始终将 f 指定为最后一个选项,并在它和文件名之间放置一个空格。(-b仅在写入物理磁带驱动器时在某些情况下很重要,因此在本讨论中可以忽略它。)