Quelle est la différence entre un tiret et deux tirets pour les paramètres d'invite de commande?

65

Je me demandais pourquoi certains programmes requièrent que leurs paramètres d'invite de commande aient deux tirets devant, alors que d'autres (la plupart) n'exigent qu'un tiret devant?

Par exemple, la plupart des programmes ressemblent à ceci: relaxer -dtd toc.xml toc_gr.xml toc_jp.xml

Alors que certains programmes ressemblent à ceci: xmllint --valid toc.xml --noout

Quelle est la raison pour laquelle certains nécessitent deux tirets au lieu d'un? Ne convient-il pas à tout le monde de s'en tenir à une norme (un tiret suffit).

Pacerier
la source
10
> N’est-il pas logique pour tout le monde de s’en tenir à une norme - oui. Tous les programmeurs respectent-ils les normes et gardent-ils la cohérence? Non, beaucoup de programmeurs ne peuvent même pas maintenir la cohérence de leurs programmes :) Cela étant dit, le consensus serait d'utiliser un tiret uniquement pour les options à une lettre et deux tirets pour tout ce qui est réellement des mots, par exemple -ivs --inputou -n --dry-run.
Slhck
1
@slhck Heys, merci pour l'aide =) Par cette convention, cela signifie-t-il que cela -dtdaurait vraiment dû être --dtd? En réalité, je me demandais ce que le tiret (et le double tiret) essayait de signifier?
Pacerier
6
Pour les points bonus: les programmes conformes aux normes Gnu --long-optionsacceptent également toute abréviation unique. Donc, pour un programme avec des options --file-inet --file-out, vous pouvez utiliser --file-o=fooou --file-i=foo, ce qui peut vous éviter de taper --very-long-optional-parameters.
BRPocock
GNU est venu avec leur convention d'utiliser deux tirets pour les options « longues », dont je suis à préférer, mais de nombreux services publics plus anciens, comme ceux fournis avec le système X Window, ainsi que ImageMagick ( par exemple , convert, mogrify) ont « long » options utilisant un seul tiret. Par exemple: xterm -fn 6x10 -geometry 80x24+30+200. Les abréviations sont pris en charge, à condition qu'ils soient distincts ( par exemple , -gou -geompour -geometry). Voir X (7) pour d'autres exemples.
TheDudeAbides le

Réponses:

18

Faites juste ls --help et regardez les options; cela devrait être évident pour vous.

Cela n'a rien à voir avec les paramètres. De nombreuses options ont une forme abrégée et une forme longue, et beaucoup ont l’une et pas l’autre.

Et aussi, en ce qui concerne les paramètres, c’est tout simplement que dans la forme longue, quand ils prennent un paramètre, on dirait qu’il est toujours avec un égal. Mais évidemment, les plus courts peuvent prendre tout autant de paramètres mais ils n'utilisent pas un égal.

Voici un extrait de ls --help( man lsdonne des informations équivalentes). Remarquez comment certains ont une forme longue sans une forme courte ( --author, --block-size), certains ont une forme courte sans une forme longue ( -c, -f, -g), et certains ont à la fois une forme longue et une forme courte ( -A/ --almost-all, -b/ --escape).

 -a, --all                  do not ignore entries starting with .
 -A, --almost-all           do not list implied . and ..
     --author               with -l, print the author of each file
 -b, --escape               print octal escapes for nongraphic characters
     --block-size=SIZE      use SIZE-byte blocks
 -B, --ignore-backups       do not list implied entries ending with ~
 -c                         with -lt: sort by, and show, ctime (time of last
                              modification of file status information)
                              with -l: show ctime and sort by name
                              otherwise: sort by ctime
 -C                         list entries by columns
     --color[=WHEN]         control whether color is used to distinguish file
                              types.  WHEN may be `never', `always', or `auto'
barlop
la source
4
Comment fait-on un ls --helpsur windows?
Pacerier
1
@Pacerier Il n'y a pas lsde Windows. La commande équivalente serait dir /?. Vous utilisez un logiciel multiplateforme qui ne respecte pas les conventions Windows habituelles, voir ma réponse.
Daniel Beck
@Pacerier Ce n'est pas intégré, mais téléchargez-le en 3ème partie, Gnuwin32 vous le téléchargez (google gnuwin32). gnuwin32 contient un paquet de paquets, chacun avec des commandes, téléchargez le paquet coreutils, qui a beaucoup de commandes communes.
Barlop
Il y a de longues options sans options courtes dans votre ls --helpextrait. Voir --authoret --block-size.
Dan
Pour répondre à la question dans le commentaire original de @ Pacerier: La manière la plus courante d'obtenir la lscommande des systèmes Windows modernes est via GIT . Le shell bash GIT ou la fenêtre CMD avec GIT bin dans le chemin PATH aura ls.
Yzorg
34

Il n'y a pas de norme répandue. Il y a une certaine cohérence, par exemple dans les programmes GNU, mais vous devez vérifier la documentation de chaque programme.

Citant Wikipedia , mon emphase:

Dans les systèmes de type Unix, le trait d'union minuscule ASCII est généralement utilisé pour spécifier des options. Le caractère est généralement suivi d'une ou plusieurs lettres . Un argument qui ne comporte qu'un seul trait d'union, sans lettre, indique généralement qu'un programme doit gérer les données provenant de l'entrée standard ou envoyer des données à la sortie standard. Deux caractères moins un trait d'union (-) sont utilisés sur certains programmes pour spécifier des "options longues" dans lesquelles des noms d'options plus descriptifs sont utilisés . C'est une caractéristique commune du logiciel GNU.

En règle générale, les traits d'union indiquent un argument prédéfini. Je pense que cela sert à les différencier, par exemple, des noms de fichiers ou d’autres étiquettes que vous pourriez utiliser comme arguments. Ce n'est pas toujours le cas, cependant (voir ci-dessous).


Vous trouverez souvent le même argument disponible à la fois comme option courte et comme option longue, comme par exemple dans ls .

Certains programmes utilisent un seul trait d'union pour les options à un caractère et deux traits d'union pour les options à plusieurs caractères, mais pas tous (on pense findà GNU ). Certains programmes ont des traits d'union optionnels ou les sautent complètement ( tarou BSD psvient à l'esprit).

Parfois, les options longues ( --foo) nécessitent des arguments, alors que les options courtes ( -f) ne le font pas (ou du moins, impliquent un argument par défaut spécifique).

Les options courtes (par exemple cut -d ' ') peuvent avoir des arguments, alors que les options longues (par exemple ls --all) ne les ont pas nécessairement.

Pour définir un comportement particulier d'un programme, vous devez parfois utiliser une option courte. Pour d'autres, vous devez utiliser une option longue et, pour certains, vous avez le choix.

Sur une note connexe, certains programmes ne peuvent gérer aucun espace entre une option et son argument , d’autres ne le peuvent pas.

Comme je l'ai écrit au début, il n'y a tout simplement pas de comportement ou de norme commun. Souvent, vous pouvez suivre un comportement similaire à la même bibliothèque que celle utilisée pour l'analyse des arguments, mais vous ne voulez probablement pas lire les sources pour le découvrir.

Vous ne pouvez vraiment pas déduire la syntaxe d'argument d'un programme de celle d'un autre.


Si vous considérez également Windows, la situation empire: alors que les appels de ligne de commande Windows utilisent traditionnellement /f(du moins la plupart du temps, des caractères simples) des options, avec :comme séparateur les options et leur valeur (voir par exemple ici ); Les utilitaires multiplates-formes sont répandus (tels que ceux que vous avez mentionnés) et apportent la syntaxe de trait d'union plus courante pour les arguments, avec toutes les incohérences mentionnées ci-dessus.

Daniel Beck
la source
2
Il convient de noter que les bibliothèques standard GNU fournissent la fonctionnalité de mappage des options une moins une lettre, deux moins plusieurs lettres, de sorte que tous les nouveaux programmes GNU et la plupart des nouveaux logiciels libres en général utilisent cette notation (par exemple - f, -f toto, --file, --file foo, --file = foo, --fil = foo, --fi = foo); throwbacks tels que tar, ps, findet tel eu leur syntaxe de ligne de commande définie par POSIX avant cette norme avait complètement gélifiée. Sur un système Gnu / Linux, il est un assez fort à parier que au moins --helpsera (presque) toujours être pris en charge, ainsi que man <command>ouinfo <command>
BRPocock
La norme GNU indique-t-elle que vous ne devriez pas avoir de formulaire court sans formulaire long ni de formulaire long sans formulaire court?
barlop
+1 pour la réponse la plus complète, incluant la mention de GNU findqui ne suit pas la "convention GNU" pour les options longues (probablement pour des raisons de conformité POSIX, comme l'a souligné @BRPocock). Je voudrais renvoyer +1 si je pouvais, pour mentionner les "commutateurs" de ligne de commande DOS / Windows, puisque la question du PO a été étiquetée comme "fenêtres", et que cette convention doit être mentionnée pour être complète.
TheDudeAbides
7

Ceci est une convention venant de * nix. Un double trait d'union précède les options lorsqu'elles sont écrites intégralement , alors qu'un trait d'union précède les options lorsqu'elles sont écrites sous une forme abrégée . Par exemple ls --all --l, peut être raccourci à ls -al. Comme on le voit, toutes les options n’ont pas leur équivalent lettre unique, bien que les plus utilisées en aient généralement.

Le fait que l'option prenne un argument ne fait pas vraiment la différence - il peut soit les accepter, soit ne pas les accepter, quelle que soit la manière dont vous entrez l'option.

Cela n'a pas vraiment d'importance si vous les écrivez pour une utilisation ponctuelle, mais lorsque vous écrivez des commandes, par exemple dans des fichiers .alias, il est habituel d'utiliser le formulaire complet. Purement pour la facilité de lecture pour la prochaine personne.

Tour
la source
Heys merci pour l'aide, Btw y a-t-il une raison pour laquelle vous tapez unix comme * nix?
Pacerier
2
@Pacerier - Unix est un nom commercial. En tapant * nix, je me réfère à tous les systèmes unix et similaires, qui sont pratiquement les mêmes. Mais surtout, c'est une force d'habitude ...
Rook
2
@Pacerier * nix peut faire référence à Linux ou à Unix. Je ne suis pas tout à fait sûr à ce sujet, car j’y ai jeté un coup d’œil il ya quelque temps, mais techniquement, si je me souviens bien, BSD appartient à la famille Unix. Techniquement, Linux n'est pas .. et FreeBSD non plus. Mais dire * nix inclurait unix / bsd, et quelque chose comme ça, par exemple linux et freebsd.
Barlop
2
+1 pour mentionner la combinaison de commande de raccourci. c'est la vraie raison pour laquelle il y a deux styles.
Ryan_S
3

ce sont des syntaxes UNIX conventionnelles,

un argument de programme prend un trait d'union ("-") suivi d'une seule lettre lorsqu'il s'agit d'une simple option (par exemple: -v ) et de deux trait d'union ("-") lorsque l'option accepte des arguments (par exemple: --file toc.xml ou --file = toc.xml )

aucun impact sur la fonctionnalité du programme.


la source
3
En outre, dans de nombreux cas, lorsque les options d’une seule lettre suivent un seul tiret, vous pouvez regrouper les lettres. Par exemple, "ls -al" est identique à "ls -a -l". Les options à double tiret ne peuvent pas être combinées de cette manière. Les options à lettre unique sont une norme plus ancienne, mais de nos jours beaucoup de commandes prendront les deux types. Par exemple, "ls --all" est identique à "ls -a".
Randy Orrison
3
En fait, une autre correction. Les options à une seule lettre avec une seule lettre peuvent prendre un paramètre, mais il n’est généralement pas lié à un signe égal. Par exemple, "tail -n 50" affiche les 50 dernières lignes d'un fichier, ce qui équivaut à "tail --lines = 50".
Randy Orrison
Par cette convention, cela signifie-t-il que --noout(dans la question ci-dessus) aurait vraiment dû être écrit comme -nooutil n’a pas d’ arguments ?
Pacerier
1
ce qui est dit dans cette réponse à propos des paramètres est totalement faux. La première phrase est évidente. La dernière phrase est évidente. Et le paragraphe du milieu qui devrait répondre à la question est totalement faux.
Barlop
@RandyOrrison quand une seule lettre je n'ai jamais vu un signe d'égalité .. et pour développer votre point, ils prennent souvent des paramètres .. wget -w 10 tête -n 3 coupe -b 2 Et regardez Ping -? !! Les charges prennent des paramètres. Cette réponse est terrible
barlop
3

Le tiret simple est implémenté par getopt et est une fonction standard posix, un tiret double dans getopt_long et est un standard gnu.

Traditionnellement, un seul tiret fournit une option à un seul caractère comme celle-ci:

-A ou -V etc. mais ne doit pas nécessairement être limité à cela. Par exemple, -Wall for gcc active tous les avertissements du compilateur pour la commande du compilateur gcc.

les arguments à double tiret ont tendance à être plus bavards et prennent souvent un paramètre fourni tel que --max-count = NUM. Cependant, --version ne prend pas d'égal.

De manière générale, il n’existe pas de règles ni de normes définies concernant la manière dont les arguments de programme doivent être spécifiés, mais uniquement un ensemble de traditions. Toutefois, si les fonctions d'analyse de ligne de commande getopt et getopt_long sont utilisées, les paramètres doivent généralement respecter la norme, car les fonctions de bibliothèque imposent une certaine manière de le faire.

Matt H
la source