Pourquoi utiliser superflous dash (-) pour passer les drapeaux d’option à tar?

35

Pour créer un fichier tar pour un répertoire, vous pouvez saisir la tarcommande avec compress, verboseet les fileoptions suivantes:

$ tar -cvf my.tar my_directory/

Mais cela fonctionne aussi pour le faire de cette façon:

 $ tar cvf my.tar my_directory/

C'est-à-dire sans le tiret (-) précédant les options. Pourquoi voudriez-vous jamais passer un tiret (-) à la liste des options?

Milktrader
la source

Réponses:

43

Il existe plusieurs modèles différents pour les options utilisées historiquement dans les applications UNIX. Plusieurs anciens, comme tar , utilisent un schéma de position:

options de commande arguments

comme par exemple tar utilise

tar * quelque chose * f "fichier exploité sur" * "chemins des fichiers à manipuler" *

Dans une première tentative pour éviter la confusion, tar et quelques autres programmes avec l'ancien style flags-arguments permettaient de délimiter les drapeaux avec des tirets, mais la plupart d'entre nous, les vieux, l'ignoraient simplement.

Certaines autres commandes ont une syntaxe de ligne de commande plus complexe, comme dd (1), qui utilise des drapeaux, des signes identiques, des noms de chemins, des arguments et une perdrix dans un arbre à poires, le tout avec un abandon sauvage.

Dans BSD et les versions ultérieures d'Unix, cela avait plus ou moins convergé vers des drapeaux à caractère unique marqués avec '-', mais cela commençait à poser quelques problèmes:

  • les drapeaux pourraient être difficiles à retenir
  • Parfois, vous vouliez réellement utiliser un nom avec '-'
  • et en particulier avec les outils GNU, le nombre de drapeaux possibles a commencé à poser des problèmes. Les outils GNU ont donc ajouté des options longues GNU telles que --output.

Sun a alors décidé que le supplément "-" était redondant et a commencé à utiliser des drapeaux de style long avec des "-" simples.

Et c'est comme ça que le désordre est arrivé maintenant.

Charlie Martin
la source
9
"et une perdrix dans un poirier" Mieux que ma tentative sèche. Vous gagnez.
dmckee
1
joli contexte historique.
1
Je remarque que beaucoup de programmes X (y compris X, de Xorg) utilisent des drapeaux de style long avec un seul -. Est-ce de Sun?
Mattdm
1
Quelle est la signification de 'perdrix dans un poirier'? (Puis-je avoir un lien utile et facile à comprendre?)
jeudi
1
@plhn Idiom. Un chant de Noël anglais traditionnel "Les douze jours de Noël" répertorie toute une série de cadeaux extravagants, qui se terminent par "une perdrix dans un poirier". Cela suggère une longue liste extravagante.
Charlie Martin
8

Vous pouvez donner des options tar de la même manière qu'unix, tar -c -f foo -v -B file1 file2 file3le tiret permettant de différencier les options et les paramètres ou les noms de fichier à la fin de la ligne de commande. Ou vous pouvez regrouper toutes les options dans le premier argument, auquel cas le tiret est facultatif.

Ensuite ps, vous pouvez utiliser les tirets si vous utilisez les options SysV-ish et les laisser de côté si vous utilisez les options BSD-ish, simplement pour rendre les choses plus confuses.

Et laisse même pas parler find.

Paul Tomblin
la source
2

Le tiret sert à distinguer les noms et les valeurs de paramètres d’options. Je suppose que c'est plus une convention standard.


la source
1
J'allais ajouter la best-practicebalise parce que je pensais que cela pouvait en résulter.
1
@ Milktrader, la question des meilleures pratiques est une question difficile. Le respect des conventions standard est une pratique exemplaire, mais ce n'est pas clair si vous souhaitez le faire dans vos cas. Cela dépendra de votre scénario. Si vous piratez une commande rapide dans le shell, vous ne vous en soucierez probablement pas beaucoup, mais si vous écrivez une bibliothèque, il est important de respecter les conventions bien établies, car vous n'avez pas le contrôle sur la façon dont cette bibliothèque sera utilisée. par les clients. Dans ce cas, vous devez couvrir tous les cas possibles et il est important de distinguer les noms des options des valeurs.
-1

Il existe quatre conventions d'utilisation des options de ligne de commande unix:

  1. -o -p -t (tiret avant chaque option)
  2. -opt (tiret avant un ensemble d'options)
  3. opt (pas de tiret avant un ensemble d'options)
  4. --long-option (double tiret avant un nom d'option)

Par exemple:

$ tar -x -v -z -f package.tar.gz
$ tar -xvzf package.tar.gz
$ tar xvzf package.tar.gz
$ tar --extract -verbose -gzip -file package.tar.gz
Jonasjacek
la source
1
Cette convention s'applique-t-elle uniquement au goudron? Qu'en est-il de ls? ls ne fonctionnera pas mais ls -lrt / ls -l -r -t fonctionnera. Pourquoi
Shashank Vyas
Les quatre conventions devraient fonctionner pour toutes les commandes.
jonasjacek
2
Non, ils ne le font pas. L’autre jour, j’ai essayé rm rf <nomfichier>, cela ne fonctionne pas non plus.
Shashank Vyas
-2

Avec le signe moins / tiret (-), vous devez conserver les options dans un ordre précis. Sans ordre moins de votre option peut changer.

Par exemple:

# tar -xvf yourfile.tar
# tar vxf yourfile.tar
Mohd. Golam Hossain
la source
Cette réponse est à moitié juste, mais autant que je sache, ce sont des drapeaux comme fcelui-là qui prennent un argument dont l'ordre est important. Voir unix.stackexchange.com/a/239120/3169
Mikel le