tar cvf或tar -cvf?


24

我已经学会了使用不带'-'的tar作为选项,例如,tar cvfz dir.tar.gz Directory/但是我最近遇到了稍微不同的tar -czvf语法(在这种情况下,我认为'f'必须是最后一个选项)。

两者都可以在linux和Mac OS上运行。是否有推荐的语法,带有不带-的ou,可以更方便地在unix风格中使用?



之所以-f必须是最后一个选项,是因为它需要一个参数,并且可以通过触摸该选项来给出该参数。tar -cvfz dir.tar.gz Directory手段来创建一个名为存档z包含的文件dir.tar.gzDirectory
JoL

Answers:


27

tar是选项语法尚未标准化的日子中最古老的命令之一。由于所有有用的调用都tar需要在提供任何文件名之前先指定一个操作,因此大多数tar实现将其第一个参数都解释为选项,即使它不是以-。开头。当前的大多数实现都接受-; 我知道的唯一例外是Minix

较早版本的POSIX和Single Unix包含一个在操作说明符之前tar没有的命令-。单一Unix V2有传统的归档cpiotar,但很少标志可以被标准化,因为现有的实现过于不同,所以标准引入了新的命令,pax,这是因为在唯一的标准归档单一Unix V3。如果你要符合标准,使用pax,但请注意,许多Linux发行版不包括在他们的基础设施,而且也没有paxMinix的。如果您想在实践中方便携带,请使用tar cf filename.tar



1
另请注意,如果Linux发行版包含pax,则通常会附带最差的已知pax实现(GNU pax),由于许多错误,应避免使用它。
schily 2015年

此外,该ps命令具有相同的行为,您可以省略-选项。
perror

1
@perror错了。的许多版本ps都不允许您忽略-。Linux版本具有带和不带选项-,但大多数具有不同的含义(BSD与System V兼容性)。
吉尔(Gilles)'所以

1
的确,在大多数情况下,我只使用ps aux...所以,我可能(部分)错了。抱歉。
perror

13

我可能是恐龙,但我认为习惯性地使用“ cvf”代替“ -cvf”可能更便于携带。我想大多数Linux发行版都使用GNU tar,我猜* BSD也会使用GNU tar,但是您会发现专有的Unix仍然使用旧的SysV tar,该Unix过去要求您在选项中不要使用'-'。 。

我不使用“ -cvf”(或“ -xf”或其他名称),即使使用最新的Arch Linux也没有问题。

另外,我想您也可以使用带有-或不带-的Sun标准“ jar”命令选项。


我同意您的回答,即使tar的信息页(这对于指定选项的三种样式非常清楚)告诉您,保留旧选项仅是为了兼容性,并且有很多选项没有旧的对应关系。
大卫·科斯塔

1
您错了:AT&T UNIX上的tar编写为没有-,但是接受-并跳过了它。调用tar的唯一可移植方法是在不带-的情况下调用它,如果您找到了一个不带-不接受内容的“ tar”实现,则这不是tar。
schily 2015年

3

UNIX上很少有不遵循当前选件标准的程序。

一个是dd,但是dd是从IBM大型机程序DDR(磁盘转储和还原)派生的。

一个是ar,另一个是tar。根据我的信息,tar希望类似于ar。

所有tar实现都可以在没有-的情况下工作,并且没有有用的实现需要-。因此,如果您想编写可移植的脚本,请检查SUSv2标准并仅使用与SUSv2兼容的命令行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.