Pourquoi `tar -xvfz` échoue, mais` tar xvfz` fonctionne?

41

tar -xvfz foo.tar.gz renvoie une erreur tar: z: Cannot open: No such file or directory

Cela est parfaitement compréhensible - le fcommutateur attend un nom de fichier et doit donc être le dernier.

Cependant, omettre le trait d'union tar xvfz foot.tar.gzfonctionne et décompresse et décompresse le fichier.

J'ai testé cela sur OS X 10.8 et Ubuntu 12.04.

Des idées pourquoi?

[édité pour ajouter]

Je l'utilise toujours tar -zxvf foo.tar.gz. Cependant, cette question a surgi à cause de ce xkcd , et ma surprise quand quelqu'un a insisté pour que tar xvfzcela fonctionne.

entrez la description de l'image ici

anu
la source
12
Désolé: xkcd.com/1168
MichaelHouse

Réponses:

61

tar a 3 types de syntaxe (selon cela ):

  • options longues (--file)
  • options courtes (-f)
  • anciennes options (f)

Pour l'ancienne syntaxe d'option, toutes les lettres doivent suivre "tar" et doivent toutes tomber dans un seul bloc sans espaces. L'ordre des lettres importe peu, tant que les arguments de ces lettres suivent le même ordre après le groupe d'options.

Cette ancienne manière d’écrire les options tar peut surprendre même les utilisateurs expérimentés. Par exemple, les deux commandes:

 # tar cfz archive.tar.gz file
 # tar -cfz archive.tar.gz file

sont assez différents. Le premier exemple utilise "archive.tar.gz" comme valeur pour l'option "f" et reconnaît l'option "z". Le deuxième exemple, cependant, utilise "z" comme valeur pour l'option "f" - probablement pas ce qui était prévu.

Les anciennes options sont conservées pour la compatibilité avec les anciennes versions de tar.

La commande avec un '-' équivaut à

tar -czf archive.tar.gz file
tar -cf archive.tar.gz -z file
tar cf archive.tar.gz -z file

C'est la raison pour laquelle votre exemple fonctionne sans "-" et non avec "-"

GeekRide
la source
3
wtf unix
BlueRaja