Как уже упоминалось выше, командная строка анализируется перед тем, как ОС передает команду Ruby. Подстановочный знак расширяется до списка имен файлов, разделенных пробелами.
Вы можете увидеть, что произойдет, если вы наберете что-то вроде echo *
в командной строке, тогда вместо нажатия Return вместо нажатия Esc затем * . Вы должны увидеть *
развернутым в списке подходящих файлов.
После нажатия Возврат эти имена будут добавлены в массив ARGV. OptionParser пройдет по ARGV и найдет флаги, которые вы определили, при необходимости возьмет следующие элементы и затем удалит их из ARGV. Когда OptionParser будет завершен, все элементы ARGV, которые не вписываются в параметры, останутся в массиве ARGV, где вы сможете их найти.
В вашем коде вы ищете один параметр для опции '-a'
или '--add FILE'
. В OptionParser есть опция Array
, которая будет извлекать элементы, разделенные запятыми, из командной строки, но затем будет разделять их пробелами.
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"
Сохраните это в файл и попробуйте свою командную строку с -a one two three
, затем с -a one,two,three
. Вы увидите, как опция Array
по-разному захватывает элементы в зависимости от того, есть ли запятые или пробелы между параметрами.
Поскольку подстановочный знак *
заменяется именами файлов, разделенными пробелами, вам придется постобработать ARGV после того, как OptionParser запустит его, или программно перелистать каталог и построить список таким образом. У ARGV есть все файлы, кроме файла, выбранного в опции -a
, так что лично я бы выбрал опцию -a
и позволил ARGV содержать все файлы.
Вам придется создать глобальную директорию, если *
имеет слишком много файлов и превышает размер буфера. Вы узнаете, если это произойдет, потому что ОС будет жаловаться.