Comme mentionné ci-dessus, la ligne de commande est en cours d'analyse avant que le système d'exploitation ne passe la commande à Ruby. Le caractère générique est en cours de développement dans une liste de noms de fichiers délimités par des espaces.
Vous pouvez voir ce qui se passera si vous tapez quelque chose comme echo *
à la ligne de commande, puis, au lieu de frapper Retour, au lieu touché Esc puis *. Vous devriez voir le *
développé dans la liste des fichiers correspondants.
Après avoir appuyé sur Retourne ces noms seront ajoutés à la matrice ARGV. OptionParser va parcourir ARGV et trouver les drapeaux que vous avez définis, récupérer les éléments suivants si nécessaire, puis les retirer de ARGV. Lorsque OptionParser est terminé, tous les éléments ARGV qui ne rentrent pas dans les options restent dans le tableau ARGV où vous pouvez les atteindre. Dans votre code, vous recherchez un seul paramètre pour l'option '-a'
ou '--add FILE'
. OptionParser a une option Array
qui va récupérer les éléments séparés par des virgules à partir de la ligne de commande mais qui seront ensuite séparés par des espaces.
require 'optparse'
options = []
opts = OptionParser.new
opts.on('-a', '--add FILE', Array) do |s|
options << s
end.parse!
print "options => ", options.join(', '), "\n"
print "ARGV => ", ARGV.join(', '), "\n"
Enregistrer que dans un fichier et essayez votre ligne de commande avec -a one two three
, puis avec -a one,two,three
. Vous verrez comment l'option Array
saisit les éléments différemment selon qu'il y a des virgules ou des espaces entre les paramètres. Étant donné que le caractère générique *
est remplacé par des noms de fichiers délimités par des espaces, vous devrez post-traiter ARGV après l'exécution d'OptionParser, ou globaliser par programme le répertoire et créer la liste de cette manière. ARGV a tous les fichiers à l'exception de celui récupéré dans l'option -a
donc, personnellement, je laisserais tomber l'option -a
et laisserais ARGV contenir tous les fichiers.
Vous devrez globaliser le répertoire si *
a trop de fichiers et dépasse la taille du tampon. Vous saurez si cela se produit parce que l'OS va se plaindre.
L'implication ici est qu'un programme Ruby doit faire son propre globbing sous Windows. Pas vrai, sur Windows Ruby globs arguments de ligne de commande automagically. Voir win32.c. – cdarke