GNU/Linux >> Tutoriels Linux >  >> Linux

Passer des options à un programme :quelle est la convention entre un tiret et deux ?

Le plus courant est GNU getopt style, avec un tiret pour les options courtes et deux tirets pour les options longues.

  • Initialement, les programmes Unix prenaient des options à une seule lettre précédées d'un seul tiret et éventuellement regroupées :

    ls -laF
    
    ls -l -a -F
    

    Les deux commandes ci-dessus sont égales.

    Lorsqu'une option prend une valeur, elle remplace le groupement :dans gpg -aofoo.gpg , -a et -o sont des options et foo.gpg est la valeur donnée à -o .

  • La plupart d'entre eux l'ont fait, de toute façon.

    tar cvzf est un spectacle courant. Les versions actuelles acceptent tar -cvzf aussi, et selon que vous ajoutez ou non le tiret, les arguments seront interprétés de manière très différente. Par exemple, ces deux signifient la même chose (notez que les options sans tiret ne sont pas juste avant leur valeur) :

    tar -xf file.tgz -vzO /etc/passwd /var/backups
    
    tar xfvzO file.tgz /etc/passwd /var/backups
    

    BSD ps utilise toujours -; SysV ps ne fait jamais. La version Linux accepte les deux versions et modifie son comportement selon qu'une option a été précédée ou non d'un tiret. (Contrairement à l'exemple tar ci-dessus, ps change l'option significations également.)

  • Les programmes X11 utilisaient des options longues précédées d'un simple tiret ou parfois d'un signe plus :

    xterm -class FooTerm +vb -u8
    

    Cela définit les options class et u8 , et annule le vb option.

    Le style X11 est incompatible avec le groupement d'options.

  • Plus tard, des options longues ont été ajoutées à GNU getopt() d'une manière compatible avec les options à une lettre.

    gpg -se --no-armor --output=signed.gpg
    

    Cela définit -s , -e , et --no-armor (qui est opposé à --armor ).

    Habituellement, --output=signed.gpg et --output signed.gpg sont équivalents. (Mais pas toujours - par exemple, curl n'accepte pas le premier, seulement le second.)

    (Si je me souviens bien, les options longues utilisaient + comme préfixe avant d'être remplacé par -- .)

  • La spécification POSIX comporte une section Utility Argument Syntax, qui décrit les options à un caractère.

La plupart des programmes Windows utilisent leurs propres analyseurs, ce qui rend les utilisateurs fous.

  • Certains nécessitent /a /b /c , d'autres autorisent le style VMS /a/b/c , d'autres encore préfèrent le style Unix /abc .
  • Le plus utilisé / comme préfixe, certains acceptent aussi - , les autres n'acceptent que - .
  • Les valeurs peuvent être données sous la forme /foo bar , /foo=bar , /foo:bar .
  • Habituellement, les espaces peuvent être /quoted "like this" , mais certains programmes prennent le " comme caractère littéral. (C'est un inconvénient de laisser le programme faire son propre découpage de mots ; sous Unix, cela est géré par le shell.)
  • Les programmes multiplateformes peuvent utiliser une implémentation de getopt .

En général, le premier se trouve dans des programmes plus anciens qui sont trop bien ancrés pour changer. Ce type d'options longues est incompatible avec le standard getopt() fonction.

Le deuxième style a été introduit par GNU getopt_long() , et est conforme aux normes existantes qui s'attendent à ce que le premier style soit regroupé avec des options courtes (c'est-à-dire -orange devrait signifier -o -r -a -n -g -e ). Ce style d'option longue est fortement préféré.


Linux
  1. Quelle est la magie de - (un tiret) dans les paramètres de ligne de commande ?

  2. À quoi sert l'option 'soname' pour créer des bibliothèques partagées ?

  3. Quel est l'équivalent de la commande Linux File pour Windows ?

  4. Quel est l'ID de partition/le type de système de fichiers pour UDF ?

  5. Qu'est-ce qui constitue un 'champ' pour la commande cut ?

Quelle est la meilleure distribution Linux pour les débutants ?

Les 40 exemples de commandes Go pour les développeurs Golang en herbe

Que fait ENV ("_") pour l'anti-débogage ?

A quoi sert le groupe "shadow" ?

Qu'est-ce qui peut faire en sorte que le passage de init=/path/to/program au noyau ne démarre pas le programme en tant qu'init ?

Quel est le fichier par défaut pour `hostname` ?