Provided by: manpages-fr-dev_3.65d1p1-1_all bug

NOM

       getopt,  getopt_long, getopt_long_only, optarg, optind, opterr, optopt - Analyser les options de la ligne
       de commande

SYNOPSIS

       #include <unistd.h>

       int getopt(int argc, char * const argv[],
                  const char *optstring);

       extern char *optarg;
       extern int optind, opterr, optopt;

       #include <getopt.h>

       int getopt_long(int argc, char * const argv[],
                  const char *optstring,
                  const struct option *longopts, int *longindex);

       int getopt_long_only(int argc, char * const argv[],
                  const char *optstring,
                  const struct option *longopts, int *longindex);

   Exigences de macros de test de fonctionnalités pour la glibc (consultez feature_test_macros(7)) :

       getopt() : _POSIX_C_SOURCE >= 2 || _XOPEN_SOURCE
       getopt_long(), getopt_long_only() : _GNU_SOURCE

DESCRIPTION

       La fonction getopt() analyse  les  arguments  de  la  ligne  de  commande.  Ses  éléments  argc  et  argv
       correspondent  aux  nombres  et  à  la  table  d'arguments qui sont transmis à la fonction main() lors du
       lancement du programme. Un élément de argv qui commence par « - » (et qui ne soit pas  uniquement  « -- »
       ou  « - ») est considéré comme une option. Les caractères à la suite du « - » initial sont les caractères
       de l'option. Si getopt() est appelée à plusieurs reprises, elle renverra successivement chaque  caractère
       de chaque option.

       La  variable  optind  est l'indice de l'élément suivant à analyser dans argv. Le système initialise cette
       valeur à 1. L'appelant peut le remettre à 1 pour recommencer l'analyse du même argv ou pour  analyser  un
       nouveau tableau de paramètre.

       Si  getopt()  trouve  un  autre  caractère  d'option, elle le renvoie, mettant à jour la variable externe
       optind et la variable statique nextchar, ainsi l'appel suivant à getopt() peut continuer  l'analyse  avec
       le caractère suivant ou l'élément argv.

       S'il  n'y  a  plus  de caractères d'option, getopt() renvoie -1. Alors, optind devient l'index du premier
       élément de argv qui ne soit pas une option.

       optstring est une chaîne contenant l'ensemble des caractères d'option autorisés. Si un de ces  caractères
       est  suivi  par un deux-points (« : »), l'option nécessite un argument, donc getopt() placera un pointeur
       sur le texte suivant dans le même argv, ou sur le texte de l'élément argv suivant dans optarg. Un  double
       deux  points  (« :: »)  signifie  qu'une option prend un argument optionnel. S'il existe un texte dans le
       même élément de argv (c'est-à-dire dans le même mot que l'option elle-même comme « -oarg ») alors il  est
       renvoyé dans optarg, sinon optarg est défini à zéro. Il s'agit d'une extension GNU. Si optstring contient
       W suivi d'un point-virgule, alors -W foo est traité comme l'option longue --foo (l'option -W est réservée
       par  POSIX.2 pour des extensions spécifique à l'implémentation). Ce comportement, spécifique à la version
       GNU, n'est pas disponible avant la bibliothèque glibc 2.

       Par défaut, getopt() permute les éléments de argv au fur et à mesure  de  son  analyse,  ainsi  tous  les
       arguments éventuels ne constituant pas des options se trouvent à la fin. Deux autres modes sont également
       implémentés :  Si  le  premier  caractère  de  optstring  vaut  « + »,  ou si la variable d'environnement
       POSIXLY_CORRECT est valide, alors l'analyse s'arrête aussitôt  qu'un  argument  ne  constituant  pas  une
       option  est  rencontré.  Si  le  premier  caractère  de  optstring  vaut  « - »,  alors  les arguments ne
       correspondant pas à une option sont manipulés comme s'ils étaient des  arguments  d'une  option  dont  le
       caractère  est  le caractère de code 1 (ceci est utilisé par les programmes qui sont conçus pour recevoir
       des options et d'autres éléments de argv dans n'importe quel ordre mais qui prennent en compte l'ordre de
       ces deux types). L'argument spécial « -- » arrête l'analyse des options, quelque soit le mode en cours.

       Si getopt() ne reconnaît pas un caractère d'option, il affiche un message d'erreur sur la sortie standard
       stderr, stocke le  caractère  dans  optopt,  et  renvoie  « ? ».  Le  programme  appelant  peut  empêcher
       l'affichage du message d'erreur en positionnant opterr à 0.

       Si  getopt() trouve dans argv un caractère d'option non inclus dans optstring, ou s'il manque un argument
       d'option, la fonction renvoie « ? » et affecte  à  la  variable  externe  optopt  le  caractère  d'option
       courant.  Si  le  premier  caractère  de optstring (suivi par « + » ou « - ») est un deux points (« : »),
       alors getopt() renvoie « : » plutôt que « ? » pour indiquer un argument d'option manquant. Si une  erreur
       est  détectée,  si  le  premier  caractère  de optstring n'est pas deux points, et si la variable externe
       opterr est non nulle, (non nulle par défaut), alors getopt() affiche un message d'erreur.

   getopt_long() et getopt_long_only()
       La fonction getopt_long() fonctionne comme  getopt()  sauf  qu'elle  accepte  également  des  noms  longs
       d'option,  commençant  par  deux  tirets  (si  le  programme accepte seulement les options longues, alors
       optstring devrait être indiquée avec une chaîne vide « "" » et non avec NULL). Les  noms  longs  d'option
       peuvent être abrégés, si l'abréviation est unique, ou si elle correspond exactement à une option définie.
       Une option longue peut prendre un argument, de la forme --arg=param ou --arg param.

       longopts  est  un pointeur sur le premier élément d'un tableau de structures struct option déclarées dans
       <getopt.h> ainsi :

           struct option {
               const char *name;
               int         has_arg;
               int        *flag;
               int         val;
           };

       La signification des différents champs est la suivante :

       name   est le nom de l'option longue.

       has_arg
              vaut : no_argument (ou 0), si l'option ne  prend  pas  d'argument,  required_argument  (ou  1)  si
              l'option prend un argument, ou optional_argument (ou 2) si l'option prend un argument optionnel.

       flag   indique  la  manière  de  renvoyer  les résultats pour une option longue. Si flag vaut NULL, alors
              getopt_long() renvoie val (par exemple, le programme appelant peut remplir val avec  le  caractère
              de  l'option  courte  correspondante).  Sinon,  getopt_long()  renvoie  0,  et flag pointe sur une
              variable définie à val si l'option est trouvée, mais reste inchangé si l'option est absente.

       val    est la valeur à renvoyer, ou à charger dans la variable pointée par flag.

       Le dernier élément de la table doit être rempli avec des zéros.

       Si longindex n'est pas NULL, il pointe sur une variable qui est définie avec l'index de  l'option  longue
       correspondant à longopts.

       getopt_long_only()  fonctionne comme getopt_long(), mais « - » tout comme « -- » peut indiquer une option
       longue. Si une option commençant par « - » (et non « -- ») ne correspond pas à une  option  longue,  mais
       correspond à une option courte, elle est analysée en tant qu'option courte.

VALEUR RENVOYÉE

       Si une option a été trouvée, alors getopt() renvoie le caractère de l'option. Si toutes les options de la
       ligne  de  commande  ont été lues, alors getopt() renvoie -1. Si getopt() rencontre un caractère d'option
       qui n'est pas dans optstring, alors « ? » est renvoyé. Si getopt() rencontre une option avec un  argument
       manquant,  alors  la  valeur renvoyée dépend du premier caractère de optstring : si c'est « : », alors ce
       caractère est renvoyé, sinon « ? » est renvoyé.

       getopt_long() et getopt_long_only() renvoient également le caractère d'option courte  s'ils  en  trouvent
       une. Pour les options longues, ils renvoient val si flag vaut NULL, et 0 sinon. Les erreurs et la fin des
       options  sont gérées comme avec getopt(), en renvoyant de surcroît « ? » pour une correspondance ambiguë,
       ou un paramètre en trop.

ENVIRONNEMENT

       POSIXLY_CORRECT
              Si cette variable est positionnée, l'analyse s'arrête dès qu'un argument ne  constituant  pas  une
              option est rencontré.

       _<PID>_GNU_nonoption_argv_flags_
              Cette variable est utilisée par bash(1) 2.0 pour communiquer à la glibc les arguments résultant de
              l'expansion des caractères génériques, et ils ne doivent pas être considérés comme des options. Ce
              comportement a été supprimé de bash(1) version 2.01, mais il est toujours géré par la glibc.

CONFORMITÉ

       getopt() :
              POSIX.2  et  POSIX.1-2001,  à  condition  que  la  variable  d'environnement  POSIXLY_CORRECT soit
              positionnée. Sinon, les éléments de argv ne sont pas vraiment  constants  puisque  l'on  peut  les
              permuter. On les déclare « const » dans le prototype pour être compatible avec d'autres systèmes.

              L'utilisation de '+' et '-' dans optstring est une extension GNU.

              Sur  certaines anciennes implémentations, getopt() était déclarée dans <stdio.h>. SUSv1 permettait
              que la déclaration apparaisse soit dans <unistd.h> ou soit  dans  <stdio.h>.  POSIX.1-2001  marque
              l'utilisation  de  <stdio.h>  comme « LEGACY ». POSIX.1-2001 ne permet pas que la déclaration soit
              dans <stdio.h>.

       getopt_long() et getopt_long_only() :
              Ces fonctions sont des extensions GNU.

NOTES

       Un programme qui analyse plusieurs tableaux de paramètres ou analyse de nouveau le même tableau plusieurs
       fois, et qui veut utiliser les extension GNU telles que '+' et '-' au début de optstring, ou  changer  la
       valeur de POSIXLY_CORRECT entre les analyses, doit réinitialiser getopt() en remettant optind à 0, plutôt
       que la valeur traditionnelle de 1. La remise à 0 force l'appel d'une routine d'initialisation interne qui
       vérifie POSIXLY_CORRECT  et vérifie les extensions GNU dans optstring.

BOGUES

       Les   spécifications   POSIX.2  de  getopt()  contiennent  une  erreur  technique  décrite  dans  POSIX.2
       interprétation 150. L'implémentation GNU (et probablement  toutes  les  autres)  adopte  un  comportement
       correct différent de la spécification.

EXEMPLE

       Le programme d'exemple trivial suivant utilise getopt() avec 2 options :-n sans valeur associée et -t val
       qui nécessite une valeur.

       #include <unistd.h>
       #include <stdlib.h>
       #include <stdio.h>

       int
       main(int argc, char *argv[])
       {
           int flags, opt;
           int nsecs, tfnd;

           nsecs = 0;
           tfnd = 0;
           flags = 0;
           while ((opt = getopt(argc, argv, "nt:")) != -1) {
               switch (opt) {
               case 'n':
                   flags = 1;
                   break;
               case 't':
                   nsecs = atoi(optarg);
                   tfnd = 1;
                   break;
               default: /* '?' */
                   fprintf(stderr, "Usage: %s [-t nsecs] [-n] name\n",
                           argv[0]);
                   exit(EXIT_FAILURE);
               }
           }

           printf("flags=%d; tfnd=%d; optind=%d\n", flags, tfnd, optind);

           if (optind >= argc) {
               fprintf(stderr, "Expected argument after options\n");
               exit(EXIT_FAILURE);
           }

           printf("name argument = %s\n", argv[optind]);

           /* Other code omitted */

           exit(EXIT_SUCCESS);
       }

       Le programme suivant illustre l'utilisation de getopt_long() avec la plupart de ses fonctionnalités.

       #include <stdio.h>     /* for printf */
       #include <stdlib.h>    /* for exit */
       #include <getopt.h>

       int
       main(int argc, char **argv)
       {
           int c;
           int digit_optind = 0;

           while (1) {
               int this_option_optind = optind ? optind : 1;
               int option_index = 0;
               static struct option long_options[] = {
                   {"add",     required_argument, 0,  0 },
                   {"append",  no_argument,       0,  0 },
                   {"delete",  required_argument, 0,  0 },
                   {"verbose", no_argument,       0,  0 },
                   {"create",  required_argument, 0, 'c'},
                   {"file",    required_argument, 0,  0 },
                   {0,         0,                 0,  0 }
               };

               c = getopt_long(argc, argv, "abc:d:012",
                        long_options, &option_index);
               if (c == -1)
                   break;

               switch (c) {
               case 0:
                   printf("option %s", long_options[option_index].name);
                   if (optarg)
                       printf(" with arg %s", optarg);
                   printf("\n");
                   break;

               case '0':
               case '1':
               case '2':
                   if (digit_optind != 0 && digit_optind != this_option_optind)
                     printf("digits occur in two different argv-elements.\n");
                   digit_optind = this_option_optind;
                   printf("option %c\n", c);
                   break;

               case 'a':
                   printf("option a\n");
                   break;

               case 'b':
                   printf("option b\n");
                   break;

               case 'c':
                   printf("option c with value '%s'\n", optarg);
                   break;

               case 'd':
                   printf("option d with value '%s'\n", optarg);
                   break;

               case '?':
                   break;

               default:
                   printf("?? getopt returned character code 0%o ??\n", c);
               }
           }

           if (optind < argc) {
               printf("non-option ARGV-elements: ");
               while (optind < argc)
                   printf("%s ", argv[optind++]);
               printf("\n");
           }

           exit(EXIT_SUCCESS);
       }

VOIR AUSSI

       getsubopt(3)

COLOPHON

       Cette page fait partie de la publication 3.65 du projet man-pages Linux. Une description du projet et des
       instructions     pour     signaler     des     anomalies    peuvent    être    trouvées    à    l'adresse
       http://www.kernel.org/doc/man-pages/.

TRADUCTION

       Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a <http://po4a.alioth.debian.org/> par
       l'équipe de traduction francophone au sein du projet perkamon <http://perkamon.alioth.debian.org/>.

       Christophe      Blaess      <http://www.blaess.fr/christophe/>      (1996-2003),       Alain       Portal
       <http://manpagesfr.free.fr/>  (2003-2006).  Florentin  Duneau  et  l'équipe  francophone de traduction de
       Debian (2006-2009).

       Veuillez signaler toute erreur de traduction en écrivant à <debian-l10n-french@lists.debian.org>  ou  par
       un rapport de bogue sur le paquet manpages-fr.

       Vous pouvez toujours avoir accès à la version anglaise de ce document en utilisant la commande « man -L C
       <section> <page_de_man> ».

GNU                                             1er novembre 2010                                      GETOPT(3)