Quelle est la différence entre les indicateurs à tiret simple et à double tiret sur les commandes du shell?

70

Je commence à travailler dans le shell et l'utilisation de ces commandes semble arbitraire. Y at-il une raison pour laquelle un drapeau a un tiret unique et un autre pourrait avoir un tiret double?

Kylex
la source
Il est censé être régi par le standard POSIX: iam.ubc.ca/guides/javatut99/essential/attributes/_posix.html
cjc
Ce lien est maintenant 404 @cjc :( Un lien probablement plus fiable pourrait être en.wikipedia.org/wiki/POSIX
Bernhard Hofmann
Meilleur lien: en.wikipedia.org/wiki/…
Craig Fisher

Réponses:

110

Un seul trait d'union peut être suivi de plusieurs indicateurs d'un seul caractère. Un double trait d'union préfixe une seule option multicaractère.

Considérons cet exemple:

tar -czf

Dans cet exemple, -czfspécifie trois drapeaux d'un seul caractère: c, zet f.

Considérons maintenant un autre exemple:

tar --exclude

Dans ce cas, --excludespécifie une seule option multicaractère nommée exclude. Le double tiret disambiguates l'argument de ligne de commande, assurant que l' tarinterprète comme au excludelieu d'une combinaison de e, x, c, l, u, det e.

psusi
la source
1
@kylex, non, puisqu'il n'y a pas d'option longue nommée simplement "c" et que le - signifie une option longue, aucune option à un seul caractère ne s'ensuit.
Psusi
13
Parfois, même les commandes les plus longues peuvent être à tiret unique. Par exemple, 'cdrecord' utilise toutes les commandes à tiret unique (-eject -dao ...). Tout dépend du programme, mais la plupart (!) D'entre eux utilisent - pour les commandes uniques et - pour les commandes à plusieurs caractères (longues)
mulaz
8
@mulaz, oui, cdrecord fait pas mal de choses loufoques.
Psusi
10
gardez également à l'esprit - utilisé seul signifie généralement la fin des options. voir ici pour plus d'informations: unix.stackexchange.com/questions/11376/…
Sirex
3
@killjoy, car, que ce soit par ignorance ou par choix, les auteurs de ces programmes n'ont bien sûr pas suivi la convention. Tout comme cdrecordmentionné il y a des années dans les commentaires ci-dessus.
psusi
17

Tout dépend du programme. Habituellement, "-" est utilisé pour les options "courtes" (une lettre, -h), et "-" pour les options "longues" (--help).

Les options courtes peuvent généralement être combinées (donc "-h -a" est identique à "-ha")

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 tirets - moins (-) 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.

la source

mulaz
la source
2
Alors pourquoi est-ce java -version et ant -version, alors?
killjoy
7

C'est vraiment une convention. Cependant, cela peut aider les analyseurs syntaxiques à connaître plus efficacement les options transmises au programme. En outre, il existe des utilitaires soignés qui peuvent aider à analyser ces commandes, tels que getopt(3)ou le non standard getopt_long(3)pour aider à analyser les arguments d'un programme.

C'est bien, car nous pouvons avoir plusieurs options courtes combinées, comme le disent d'autres réponses, comme tar -xzf myfile.tar.gz.

S'il y avait un argument "lisa" ls, il y aurait probablement un sens différent à taper à ls -lisacelui de ls --lisa. Les premiers sont les l, i, set les aparamètres, pas le mot.

En fait, vous pourriez écrire ls -l -i -s -aexactement la même chose que ls -lisa, mais cela dépend du programme.

Il y a aussi des programmes qui n'obéissent pas à cette convention. Plus particulièrement pour ma vue, ddet gcc.

ssice
la source
3

options courtes avec tiret unique vs options longues avec tiret double

les options courtes peuvent être combinées en un seul argument;

for example: ls -lrt #instead of ls -l -r -t

Si nous autorisons les options longues avec un tiret unique, cela crée une ambiguïté. Pour résoudre ce problème, nous utilisons un double tiret pour les options longues.

Premraj
la source