Man page - getopt_long(3)

Packages contains this manual

Available languages:

en fr ja de

Manual

getopt

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
getopt_long() et getopt_long_only()
VALEUR RENVOYÉE
ENVIRONNEMENT
ATTRIBUTS
VERSIONS
STANDARDS
HISTORIQUE
NOTES
EXEMPLES
getopt()
getopt_long()
VOIR AUSSI
TRADUCTION

NOM

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

BIBLIOTHÈQUE

BibliothĂšque C standard ( libc , -lc )

SYNOPSIS

#include <unistd.h>

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

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

#include <getopt.h>

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

Exigences de macros de test de fonctionnalités pour la glibc (consulter 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 arguments argc et argv correspondent au nombre et Ă  la table d’élĂ©ments qui sont transmis Ă  la fonction main () lors du lancement du programme. Un Ă©lĂ©ment de argv qui commence par « - » (et qui n’est pas uniquement « -- » ou « - ») est considĂ©rĂ© comme une option. Les caractĂšres Ă  la suite du ou des « - » initiaux 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’index de l’élĂ©ment suivant Ă  analyser dans argv . Le systĂšme initialise cette valeur à 1. L’appelant peut la remettre à 1 pour recommencer l’analyse du mĂȘme tableau de paramĂštres argv ou pour en analyser un nouveau.

Si getopt () trouve un autre caractĂšre d’option, elle renvoie ce caractĂšre en mettant Ă  jour la variable externe optind et la variable statique nextchar , de façon Ă  ce que l’appel suivant Ă  getopt () puisse continuer l’analyse avec le caractĂšre d’option suivant ou l’élĂ©ment suivant de 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 n’est pas une option.

chaine_options est une chaĂźne contenant l’ensemble des caractĂšres d’option autorisĂ©s. Un caractĂšre d’option autorisĂ© est un caractĂšre ascii (7) imprimable sur 1 octet (pour lequel isgraph (3) renverrait une valeur diffĂ©rente de zĂ©ro) autre que « - », « : » ou « ; ». Si un de ces caractĂšres est suivi par un deux-points (« : »), l’option nĂ©cessite un argument, donc getopt () placera dans optarg un pointeur sur le texte suivant dans le mĂȘme Ă©lĂ©ment de argv ou sur le texte de l’élĂ©ment de argv suivant. Un double deux-points (« :: ») signifie qu’une option prend un argument facultatif. S’il existe un texte dans le mĂȘme Ă©lĂ©ment de argv (c’est-Ă -dire dans le mĂȘme mot que le nom de l’option elle-mĂȘme comme « -oarg »), il est renvoyĂ© dans optarg , sinon optarg est dĂ©fini Ă  zĂ©ro. Il s’agit d’une extension GNU. Si chaine_options contient W suivi d’un point-virgule, -W foo est traitĂ© comme l’option longue --foo (l’option -W est rĂ©servĂ©e par POSIX.2 pour des extensions spĂ©cifiques Ă  l’implĂ©mentation). Ce comportement, spĂ©cifique Ă  la version GNU, est pris en charge Ă  partir de la version 2 de la bibliothĂšque glibc.

Par dĂ©faut, getopt () permute les Ă©lĂ©ments de argv au fur et Ă  mesure de son analyse, de façon Ă  ce qu’en fin de compte, les arguments ne constituant pas des options se trouvent Ă  la fin. Deux autres modes d’analyse sont Ă©galement implĂ©mentĂ©s : si le premier caractĂšre de chaine_options vaut « + » ou si la variable d’environnement POSIXLY_CORRECT est dĂ©finie, l’analyse s’arrĂȘte dĂšs qu’un argument ne constituant pas une option est rencontrĂ©. Si le premier caractĂšre de chaine_options est autre que « + », il est traitĂ© comme une option normale. Si le comportement induit par la dĂ©finition de POSIXLY_CORRECT est requis, chaine_options contiendra deux symboles « + ». Si le premier caractĂšre de chaine_options vaut « - », les arguments ne correspondant pas Ă  une option sont manipulĂ©s comme s’ils Ă©taient des arguments d’une option avec le code de caractĂšre 1 (cela est utilisĂ© par les programmes 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 d’élĂ©ment). L’argument spĂ©cial « -- » arrĂȘte l’analyse des options, quel que soit le mode d’analyse en cours.

getopt () peut dĂ©tecter deux types d’erreur lors du traitement de la liste d’options : (1) un caractĂšre d’option non spĂ©cifiĂ© dans chaine_options et (2) un argument d’option manquant (c’est-Ă -dire une option sans son argument attendu Ă  la fin de la ligne de commande). Les erreurs de ce type sont traitĂ©es et signalĂ©es comme suit :

-

Par dĂ©faut, getopt () affiche un message d’erreur sur la sortie d’erreur standard, place le caractĂšre d’option erronĂ© dans optopt et renvoie « ? » comme rĂ©sultat.

-

Si l’appelant a dĂ©fini la variable globale opterr Ă  zĂ©ro, getopt () n’affiche pas de message d’erreur. L’appelant peut dĂ©tecter la prĂ©sence d’une erreur en vĂ©rifiant si la fonction a renvoyĂ© « ? » (par dĂ©faut, opterr possĂšde une valeur diffĂ©rente de zĂ©ro).

-

Si le premier caractĂšre de chaine_options (suivant un des caractĂšres facultatifs « + » ou « - » dĂ©crits ci-dessus) est un « : », lĂ  non plus, getopt () n’affiche pas de message d’erreur. En outre, elle renvoie « : » au lieu de « ? » pour indiquer un argument d’option manquant, ce qui permet Ă  l’appelant de distinguer les deux types 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, chaine_options doit ĂȘ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 :

nom

est le nom de l’option longue.

has_arg

vaut : aucun_argument (ou 0 ), si l’option ne prend pas d’argument, argument_requis (ou 1 ) si l’option prend un argument, ou argument_facultatif (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, 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 à affecter à la variable pointée par flag .

Le dernier Ă©lĂ©ment de la table doit ĂȘtre rempli avec des zĂ©ros.

Si longindex est diffĂ©rent de 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, getopt () renvoie le caractĂšre de l’option. Si toutes les options de la ligne de commande ont Ă©tĂ© lues, getopt () renvoie -1 . Si getopt () rencontre un caractĂšre d’option qui n’est pas dans chaine_options , « ? » est renvoyĂ©. Si getopt () rencontre une option avec un argument manquant, la valeur renvoyĂ©e dĂ©pend du premier caractĂšre de chaine_options : si c’est « : », ce caractĂšre est renvoyĂ©, sinon « ? » est renvoyĂ©.

getopt_long () et getopt_long_only () renvoient Ă©galement le caractĂšre d’option courte si elles en trouvent une. Pour les options longues, elles 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 dĂ©finie, 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 ne devant donc pas ĂȘtre considĂ©rĂ©s comme des options. Ce comportement a Ă©tĂ© supprimĂ© de bash (1) 2.01, mais il est toujours pris en charge par la glibc.

ATTRIBUTS

Pour une explication des termes utilisés dans cette section, consulter attributes (7).

Image grohtml-3869719-1.png

VERSIONS

POSIX spĂ©cifie que l’argument du tableau argv doit ĂȘtre const , mais ces fonctions permutent ses Ă©lĂ©ments si la variable d’environnement POSIXLY_CORRECT n’est pas dĂ©finie. Le prototype effectif utilise const pour ĂȘtre compatible avec les autres systĂšmes ; cette page, cependant, ne montre pas le qualificateur pour Ă©viter de perturber les lecteurs.

STANDARDS

getopt ()

POSIX.1-2008.

getopt_long ()
getopt_long_only
()

GNU.

L’utilisation de « + » et « - » dans chaine_options est une extension GNU.

HISTORIQUE

getopt ()

POSIX.1-2001 et POSIX.2.

Sur certaines anciennes implĂ©mentations, getopt () Ă©tait dĂ©clarĂ©e dans <stdio.h> . SUSv1 permettait que la dĂ©claration apparaisse soit dans <unistd.h> , soit dans <stdio.h> . POSIX.1-1996 considĂšre la dĂ©claration dans <stdio.h> comme « LEGACY » (obsolĂšte), et POSIX.1-2001 n’exige pas que la dĂ©claration soit dans <stdio.h> .

NOTES

Un programme qui analyse plusieurs tableaux de paramĂštres ou analyse plusieurs fois le mĂȘme tableau et qui veut utiliser les extensions GNU telles que « + » et « - » au dĂ©but de chaine_options , ou changer la valeur de POSIXLY_CORRECT entre les analyses, doit rĂ©initialiser getopt () en remettant optind Ă  0 , plutĂŽt qu’à la valeur traditionnelle de 1 . La remise Ă  0 force l’appel d’une routine d’initialisation interne qui revĂ©rifie la dĂ©finition de POSIXLY_CORRECT et recherche les extensions GNU dans chaine_options .

Les arguments de la ligne de commande sont analysĂ©s selon leur ordre strict, ce qui signifie qu’une option nĂ©cessitant un argument va consommer l’argument suivant, qu’il s’agisse de son argument correctement spĂ©cifiĂ© ou de l’option suivante (auquel cas l’utilisateur aura mal rĂ©digĂ© la ligne de commande). Par exemple, si chaine_options contient « 1n: » et si l’utilisateur fournit une ligne de commande incorrecte en spĂ©cifiant prog -n -1 , l’option -n se verra affecter la valeur de optarg « -1 », et l’option -1 sera considĂ©rĂ©e comme non spĂ©cifiĂ©e.

EXEMPLES

getopt()

Le programme d’exemple trivial suivant utilise getopt () avec deux options : -n sans valeur associĂ©e et -t val qui nĂ©cessite une valeur.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.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] nom\n",
argv[0]);
exit(EXIT_FAILURE);
}
}
printf("flags=%d; tfnd=%d; nsecs=%d; optind=%d\n",
flags, tfnd, nsecs, optind);
if (optind >= argc) {
fprintf(stderr, "Argument requis aprĂšs les options\n");
exit(EXIT_FAILURE);
}
printf("argument nom = %s\n", argv[optind]);
/* Le reste du code n’est pas mentionnĂ© */
exit(EXIT_SUCCESS);
}

getopt_long()

Le programme suivant montre l’utilisation de getopt_long () en illustrant la plupart de ses fonctionnalitĂ©s.

#include <getopt.h>
#include <stdio.h> /* pour printf */
#include <stdlib.h> /* pour exit */
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", argument_requis, 0, 0 },
{"append", aucun_argument, 0, 0 },
{"delete", argument_requis, 0, 0 },
{"verbose", aucun_argument, 0, 0 },
{"create", argument_requis, 0, 'c'},
{"file", argument_requis, 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(" avec l’argument %s", optarg);
printf("\n");
break;
case '0':
case '1':
case '2':
if (digit_optind != 0 && digit_optind != this_option_optind)
printf("des chiffres apparaissent dans deux éléments différents de argv.\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 ayant pour valeur '%s'\n", optarg);
break;
case 'd':
printf("option d ayant pour valeur '%s'\n", optarg);
break;
case '?':
break;
default:
printf("?? getopt a renvoyé le caractÚre de code 0%o ??\n", c);
}
}
if (optind < argc) {
printf("éléments de argv autres que des options : ");
while (optind < argc)
printf("%s ", argv[optind++]);
printf("\n");
}
exit(EXIT_SUCCESS);
}

VOIR AUSSI

getopt (1), getsubopt (3)

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org> et Lucien Gentis <lucien.gentis@waika9.com>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n’y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .