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

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

我正在尝试使用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

为什么它对不同的选项顺序给出不同的响应?即-cfvvs cvf
根据我在 bash 脚本中学到的知识,选项顺序并不重要。

答案1

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

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

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

tar -f foo.tar *jpg

你正在运行的是

tar -cfv test.tar *.jpg

tar理解为“创建 ( ) 一个名为( )-c的存档,其中包含文件和任何以.v-fvtest.tar.jpg

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

答案2

只要选项不需要值,顺序并不重要。在你的情况下-F需要指定一个文件名。

在第一种情况下(焦油-cfv)该命令认为输出文件名是 v 因为是在之后-F

答案3

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

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

相关内容