Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

getop_long avec plusieurs arguments

6 réponses
Avatar
n
coucou tout le monde,
j'utilise getop_long pour parser les arguments pass=E9s =E0 mon programme
(j'ai pris pour exemple le code de chown qui utilise aussi cette
fonction), mais je ne vois pas comment garer plusieurs fichiers de
cette mani=E8re :
./monProg --file fichier1 fichier2 fichier3
ou bien encore
./monProg --file *.ext
=E0 chaque fois, le programme retourne :
"This arguments are not options : fichier2 fichier3"
Ce qui est normal, mais comment faire pour lui faire prendre en compte
que apr=E8s un --file, il puisse y avoir plusieurs arguments ?
J'ai vu qu'il y avait d=E9j=E0 eu plusieurs post =E0 ce sujet dans ce
groupe, avec parfois des r=E9ponses du genre "getop ne permet pas cela"
alors comment fait on pour le faire ? parce que il y a un tas de
programme qui les utilisent (pratiquement toutes les commandes de bases
unix : ls, chown,...), je n'ai pas r=E9ussi =E0 trouver de r=E9ponse
claire pour g=E9rer tout mes param=E8tre...

(je pr=E9cise que je suis un peut d=E9butant et que je ne comprend pas
encore le lisp, par contre le fran=E7ais, le c, l'algo et le java, y a
pas de soucis ;) )

merci

6 réponses

Avatar
Nicolas George
"" wrote in message
:
J'ai vu qu'il y avait déjà eu plusieurs post à ce sujet dans ce
groupe, avec parfois des réponses du genre "getop ne permet pas cela"


Il me semble bien.

alors comment fait on pour le faire ? parce que il y a un tas de
programme qui les utilisent (pratiquement toutes les commandes de bases
unix : ls, chown,...), je n'ai pas réussi à trouver de réponse
claire pour gérer tout mes paramètre...


ls, chown et consorts ne prennent pas d'options à plusieurs arguments : il
prennent des arguments qui ne sont pas des options. Tout ce qui reste après
le passage de getopt, ce sont des arguments qui ne sont pas des options.

Avatar
Nicolas George
"" wrote in message
:
J'ai vu qu'il y avait déjà eu plusieurs post à ce sujet dans ce
groupe, avec parfois des réponses du genre "getop ne permet pas cela"


Il me semble bien.

alors comment fait on pour le faire ? parce que il y a un tas de
programme qui les utilisent (pratiquement toutes les commandes de bases
unix : ls, chown,...), je n'ai pas réussi à trouver de réponse
claire pour gérer tout mes paramètre...


ls, chown et consorts ne prennent pas d'options à plusieurs arguments : il
prennent des arguments qui ne sont pas des options. Tout ce qui reste après
le passage de getopt, ce sont des arguments qui ne sont pas des options.

D'ailleurs, si tu y réfléchis bien, quand tu lis :

frobnicate --exclude foo bar baz qux

comment sais-tu si bar est un argument à frobnicate, ou bien un argument à
l'option --exclude ? Ça n'est pas possible.

Avatar
n
Ba alors comment fonctionne ls ?
Parce que je peux faire
ls -l monFichier1 monFichier2
et ça marche

"" wrote in message
:
J'ai vu qu'il y avait déjà eu plusieurs post à ce sujet dans ce
groupe, avec parfois des réponses du genre "getop ne permet pas cela"


Il me semble bien.

alors comment fait on pour le faire ? parce que il y a un tas de
programme qui les utilisent (pratiquement toutes les commandes de bases
unix : ls, chown,...), je n'ai pas réussi à trouver de réponse
claire pour gérer tout mes paramètre...


ls, chown et consorts ne prennent pas d'options à plusieurs arguments : il
prennent des arguments qui ne sont pas des options. Tout ce qui reste apr ès
le passage de getopt, ce sont des arguments qui ne sont pas des options.

D'ailleurs, si tu y réfléchis bien, quand tu lis :

frobnicate --exclude foo bar baz qux

comment sais-tu si bar est un argument à frobnicate, ou bien un argumen t à
l'option --exclude ? Ça n'est pas possible.



Avatar
Stephane Chazelas
2007-01-18, 00:41(-08), :
Ba alors comment fonctionne ls ?
Parce que je peux faire
ls -l monFichier1 monFichier2
et ça marche
[...]


[Merci de poster a l'endroit]

monFichier2 et monFichier2 ne sont pas des arguments de l'option
-l, -l ne prend pas d'arguments. monFichier1 et monFichier1 sont
les arguments qu'il reste apres parsing des options.

Il est impossible qu'une option prenne un nombre variable
d'arguments a moins que ce nombre soit specifié d'une facon ou
d'une autre comme:

cmd -l 3 a b c d e

pour dire que -l prend ici 3 arguments (et que donc d et e sont
les arguments restant).

Mais getopt ne permet pas ca. getopt definit une convention de
passage d'options standard, qu'il vaut mieux essayer de suivre
pour garder une coherence.

Si tu veux passer plusieurs arguments a une option, utilise
plutot un separateur:

ps -p 123,124,234

Ici, -p prend un argument (pour getopt) mais le code de -p le
decoupe ensuite en suivant les virgules.

--
Stéphane

Avatar
Nicolas George
Stephane Chazelas wrote in message
:
Si tu veux passer plusieurs arguments a une option, utilise
plutot un separateur:

ps -p 123,124,234

Ici, -p prend un argument (pour getopt) mais le code de -p le
decoupe ensuite en suivant les virgules.


Berk. Ça veut dire écrire un parseur, et c'est l'horreur si on veut avoir un
des arguments qui contient le délimiteur. Je trouve :

ps -p 123 -p 124 -p 234

nettement préférable.

Avatar
Rémi Moyen
wrote:

Salut,

j'utilise getop_long pour parser les arguments passés à mon programme
[...]

Ce qui est normal, mais comment faire pour lui faire prendre en compte
que après un --file, il puisse y avoir plusieurs arguments ?


J'ai découvert il y a un moment argp qui, il me semble et pour autant
que ma mémoire ne soit pas trop mauvaise, permet de spécifier le nombre
d'arguments à une option.

Globalement, j'ai eu beaucoup de mal à piger comment ça marchait et je
m'en suis sorti avec les man et la doc chez Gnu :
http://www.gnu.org/software/libc/manual/html_node/Parsing-Program-Arguments.html#Parsing-Program-Arguments

Mais il me semble aussi que d'une part argp ne permet pas d'avoir un
nombre variable d'arguments, pour cause des limitations décrites par les
autres, et d'autre part que c'est un truc Gnu et donc pas forcément
disponible sur les autres systèmes (en particulier, j'ai souvenir de
stations SunOS où ça n'existait pas).

Si ça peut t'aider...
--
Rémi Moyen