Path: ...!news.mixmin.net!aioe.org!K7PIs9tCGQ+WHJa7e6BylQ.user.46.165.242.75.POSTED!not-for-mail From: Alain Ketterlin Newsgroups: fr.comp.os.unix Subject: Re: =?utf-8?Q?r=C3=A8gle?= pour =?utf-8?Q?=C3=A9crire?= les "usage: ..." Date: Mon, 11 Jul 2022 23:17:23 +0200 Organization: =?utf-8?Q?Universit=C3=A9?= de Strasbourg Message-ID: <875yk3xsbg.fsf@universite-de-strasbourg.fr.invalid> References: <62c8c4eb$0$24781$426a74cc@news.free.fr> <62c98a7b$0$18716$426a74cc@news.free.fr> <87a69ix9rl.fsf@universite-de-strasbourg.fr.invalid> <62cc5318$0$18751$426a34cc@news.free.fr> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Injection-Info: gioia.aioe.org; logging-data="44387"; posting-host="K7PIs9tCGQ+WHJa7e6BylQ.user.gioia.aioe.org"; mail-complaints-to="abuse@aioe.org"; User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.2 (gnu/linux) X-Notice: Filtered by postfilter v. 0.9.2 Cancel-Lock: sha1:gIzDEODHJhpAA4khaEuzh+aY4wk= Bytes: 4398 Lines: 94 Olivier Miakinen writes: > Le 11/07/2022 18:43, Thomas r=C3=A9pondait =C3=A0 Alain Ketterlin : [...] >>> Si l'ordre des options est sans importance, il vaut peut-=C3=AAtre mieu= x en >>> donner une liste lin=C3=A9aire, comme le fait en g=C3=A9n=C3=A9ral --he= lp (ou le man). >>> Un synopsis "mkdir [-m mode] [-p]" aurait l'air d'imposer l'ordre. >>=20 >> ah ben tant mieux : >> j'ai horreur de l'analyse de texte, et la lecture des arguments en fait= =20 >> partie. >> =C3=A7a me parait bcp moins compliqu=C3=A9 =C3=A0 faire avec un ordre im= pos=C3=A9. Je te comprends : dans ton cas, tu peux analyser les arguments avec une cascade de if. Mais imagine que tu =C3=A9crives "ls" : difficile d'exiger l= es options dans l'ordre alphab=C3=A9tique. > Permets-moi d'=C3=AAtre en complet d=C3=A9saccord avec toi sur ce point, = parce que > l=C3=A0 l'usage est quasiment universel, du moins pour toutes les options= avec > tiret. > > Je veux dire que si la syntaxe propos=C3=A9e est : > usage: rapid [-v] -ni [-od dir] gui_file... > > alors je m'attendrais =C3=A0 ce que toutes ces =C3=A9critures soient auto= ris=C3=A9es : > rapid -v -ni -od dir gui_file... > rapid -ni -v -od dir gui_file... > rapid -ni -od dir -v gui_file... > rapid -v -od dir -ni gui_file... > rapid -od dir -v -ni gui_file... > rapid -od dir -ni -v gui_file... > > Bien s=C3=BBr je m'interdirais seulement de mettre 'dir' ailleurs que jus= te > derri=C3=A8re '-od', ou de mettre 'gui_file...' ailleurs qu'=C3=A0 la fin. C'est la vision Posix, telle qu'elle est impl=C3=A9ment=C3=A9e dans la fonc= tion getopt() -- sauf que les options doivent =C3=AAtre mono-caract=C3=A8re. Dan= s ce cas (options -v -n -o), on =C3=A9crirait (en C) : while ((opt =3D getopt(argc, argv, "vno:")) !=3D -1) /* ":" =3D argumen= t */ { switch (opt) { case 'v': ... break; /* ... */ case 'o': whatever =3D optarg; ... break; default: wtf ("option inconnue"); } } if (optind >=3D argc) wtf ("il faut au moins un gui_file"); /* les "gui_file" sont argv[optind] etc. */ getopt() s'occupe de tout, y compris permuter les =C3=A9l=C3=A9ments de arg= v si n=C3=A9cessaire pour permettre "rapid gui1 -v gui2", traiter l'option "--" pour permettre ensuite un fichier appel=C3=A9 "-guifile" ou m=C3=AAme "-v", accepter "-vn" comme "-v -n", accepter "-odir" comme "-o dir", etc. J'en oublie s=C3=BBrement. Tellement pratique qu'on cherche rarement ailleurs. Par contre cela oblige =C3=A0 la fin =C3=A0 v=C3=A9rifier la coh=C3=A9rence (si il y a une = option -o il faut qu'il y ait aussi l'option -n). Presque tous les outils standard utilisent =C3=A7a, je pense (sauf les commandes avec des options de folie, comme gcc). Les directives Posix sont l=C3=A0 : https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html#ta= g_12_02 Et la GNU libc a ses propres extensions, par exemple pour permettre "--verbose" etc. -- Alain.