Je me demande de demander la différence de ces deux commandes (c'est-à-dire que seul l'ordre de leurs options est différent):
tar -zxvf foo.tar.gz
tar -zfxv foo.tar.gz
Le premier a fonctionné parfaitement mais le second a dit:
tar: You must specify one of the `-Acdtrux' or `--test-label' options
Try `tar --help' or `tar --usage' for more information.
Et goudron avec --test-label
et -zfxv
dit:
tar (child): xv: Cannot open: No such file or directory
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now
Ensuite, j'ai regardé le manuel de tar et j'ai réalisé que tous les exemples qu'il y avait à l'aide de switch -f
à la fin !!
AFAICT il n'y a pas besoin de cette restriction, ou est-ce?! parce qu'à mon avis, les commutateurs doivent être commandés gratuitement.
linux
command-line
tar
khikho
la source
la source
gtar option parsing
, vous avez découvert une autre raison de ne pas utiliser gtar.-f
s'attend à ce que le nom de fichier suive. Dans votre deuxième version, vous avez spécifié-fxv
ce qui - pour tar - signifie que le nom de fichier est "xv".Réponses:
En regardant votre message d'erreur, il est évident que vous ne l'avez pas utilisé
tar
mais plutôtgtar
.En général, cela peut aider à comprendre les choses:
tar
a normalement toujours besoin d'un argument de fichier. S'il est manquant, il lira / écrit depuis / vers le véritable périphérique de bande par défaut du système.star
a changé cela en 1982 pour utiliser stdin / stdout par défaut et d'autres implémentations tar (par exemple gtar) ont récemment suivi cet exemple.tar
n'implémente pas le début-
des options appeléeskey letters
dans le cas de la commande tar. Certaines implémentations ont été ajoutées par la suite-
sous la forme d'une lettre clé sans opération pour la commodité des utilisateurs, mais vous ne pouvez pas vous y fier.La façon d'
tar
analyser ses arguments (en particulier l'argument du fichier archive) est très risquée. J'ai vu de nombreuses archives tar qui ont détruit l'un des fichiers qui devraient être dans l'archive car l'argument de fichier associé a été pris comme fichier d'archive tar.star
pour cette raison (si appelé nativement asstar
) ne permet pas de concaténer "f" avec d'autres options. Sistar
est appelé,tar
il implémente la compatibilité de ligne de commande avectar
, mais gère toujours l'argument de la lettre clé "f" différemment: l'argument n'est autorisé que s'il fait référence à un fichier de périphérique réel ou lorsque (en mode écriture) le fichier n'existe pas encore .Je recommande d'éviter la ligne de commande tar risquée d'origine et plutôt d'utiliser la syntaxe de ligne de commande plus sûre moderne que vous obtenez
star
.En raison de la syntaxe problématique de la ligne de commande de
tar
, il y avait ce qu'on appelletar wars
au début des années 1990. En conséquence, le programmepax
(latin pour «paix» dans les guerres de goudron) a été créé et standardisé.pax
cependant n'a pas gagné en popularité car sa syntaxe est moins risquée mais aussi moins intuitive que la syntaxe tar. Un autre problème peut êtregpax
plus ou moins non entretenu.la source
star
?tar
etcpio
.star
« s-f"$file"
est également (en plusind
) un problème avec les noms de fichiers commençant par=
. Il faut donc l'écrire soit-f="$file"
ou-f "$file"
. Je ne suis pas sûr d'appeler votre option étoile plus sûre ou moderne .-long
les options longues de style sont incompatibles avec les-xyz
options courtes condensées ou-xarg
. C'est pourquoi les options longues de style X11 nécessitent que les options courtes soient séparées (-x -y
, pas-xy
) et les arguments d'option sur des arguments séparés (xterm -n foo
, nonxterm -nfoo
). Et c'est pourquoi il y a un tiret supplémentaire dans les options longues GNU, pour éliminer la confusion possible avec les options courtes, et pourquoi les options longues de style GNU sont une meilleure conception. Vous ne pouvez-foo
coexister qu'avec-x -y -xy
si vous faites très attention à éviter les chevauchements.L'ordre des commutateurs est libre, mais
-f
a un argument obligatoire qui est le fichier quitar
va lire / écrire.Vous pourriez faire
et cela fonctionnera, et a votre exigence d'un ordre non spécifique de commutateurs.
C'est ainsi que fonctionnent toutes les commandes qui ont des options qui ont des arguments.
la source
-f=./myfile
, c'est-à-dire que f prend une valeur, ce n'est pas un drapeau, c'est une entrée.Traditionnellement, les options de tar sont plus ou moins "sans commande" (l'ordre des options
f
etb
importe peu si les deux sont spécifiées). L'utilisation d'un tiret de tête, cependant, oblige GNU tar à analyser les options d'une manière considérée comme plus cohérente avec d'autres commandes, où la spécification d'une option qui nécessite un argument (tel que le nom de fichier pourf
) consommera immédiatement le reste du "mot", le cas échéant, comme argument (traditionnellement, tar utilise le mot suivant comme nom de fichier / taille de bloc lorsquef
oub
est spécifié). Dans votre cas, il a pris "xv" comme nom de fichier.Cependant, ce comportement ne peut pas être invoqué pour la portabilité. Pour une portabilité maximale, vous devez éviter d'utiliser un tiret, toujours mettre en
f
dernier et toujours mettre un espace entref
et le nom de fichier. C'est, cependant, une simplification qui tombe en panne si vous avez besoin de l'b
option ou en général toute option (telle queC
) autre quef
celle qui nécessite un argument.Ceci est documenté dans la section du manuel de tar "Les trois styles d'options" . Certaines autres implémentations (par exemple FreeBSD) se réfèrent aux anciennes options de style comme un "mot d'option groupé". Et bien sûr, certaines implémentations peuvent uniquement prendre en charge ce type d'option, et peuvent ou non ignorer un tiret si elles sont incluses. Il s'agit de la seule forme d'invocation spécifiée dans la spécification Unix unique et donc garantie de fonctionner sur presque tous les systèmes.
la source
C
dans BSD ou GNU tar. Schily tar la prend en charge en tant que -C mais pas en C, toutes la prend en charge en tant que -C).Dans le goudron, le - dans les commutateurs est obsolète depuis de nombreuses années et n'est plus nécessaire. Le goudron vous le disait, mais ce n'est plus le cas.
la source