une solution partielle accessible au public existe-t-elle pour parsingr les options de ligne de commande de style * nix sans connaître au préalable les clés?

Existe-t-il une solution partielle publiquement disponible (dans n’importe quelle langue) pour parsingr les options de ligne de commande * nix dans une structure de données dans le cas où les clés d’option ne sont pas connues à l’avance .

en gros, parsingr quelque chose comme

my-script -x ex --y=why zebra 

et obtenir

 {'x': 'ex', 'y': 'why'} 

sans savoir que les touches d’option seront x et y avant l’parsing.

des questions similaires ont été posées concernant perl et java , mais aucune réponse positive.

Je comprends que les “options de ligne de commande” ne sont pas une syntaxe bien définie et qu’une telle solution ne produira pas la sortie souhaitée pour toutes les entrées, mais demande si une telle solution partielle est connue.

Analyser les options de ligne de commande UNIX en général n’est pas possible sans schémas, en particulier lors de la prise en charge des conventions GNU (par exemple, autoriser le mélange entre les options et les arguments).

Considérez l’utilisation que vous avez donnée ici:

 my-script -x ex --y=why zebra 

Maintenant, devrait-il être:

 {options: {x: "ex", y: "why"}; arguments=["zebra"]} 

… ou devrait-il être …

 {options: {x: True, y: "why"}; arguments=["ex", "zebra"]} 

La réponse est que vous ne savez pas sans savoir si x accepte un argument – ce qui signifie que vous avez besoin d’un schéma.


Considérez aussi:

 nice -n -1 

Est-ce que -1 est un argument pour -n , ou est-ce que 1 est une valeur clé? Encore une fois, vous ne pouvez pas dire.


Ainsi: les parsingurs de ligne de commande Schemaless existent, mais ne couvrent pas suffisamment de cas pour être largement utiles – et sont donc généralement isolés dans les programmes qui les utilisent, plutôt que d’être intégrés dans une bibliothèque.

En passant, un parsingur de ligne de commande schemaless typique de bash (4.0 ou plus récent) peut ressembler à ceci:

 # put key/value pairs into kwargs, other arguments into args declare -A kwargs=( ) args=( ) args_only=0 for arg; do if (( args_only )); then args+=( "$arg" ) continue fi case $arg in --) args_only=1 ;; --*=*) arg=${arg#--} kwargs[${arg%%=*}]=${arg#*=} ;; --*) kwargs[${arg#--}]=1 ;; -*) kwargs[${arg#-}]=1 ;; *) args+=( "$arg" ) ;; esac done 

Cela fonctionnerait avec …

 my-script --x=ex --y=why zebra 

… résultant dans les valeurs:

 args=( zebra ) kwargs=( [x]=ex [y]=why ) 

… et aussi avec quelques cas utiles plus intéressants, mais il y aurait encore un long chemin à parcourir pour traiter le cas général.