Как я могу разделить строку, как это делают оболочки, чтобы заполнить ARGV? - PullRequest
8 голосов
/ 20 мая 2011

Мне нужен метод Ruby или регулярное выражение, которое позволит мне разбить строку аргументов командной строки в массив, похожий на ARGV.То, что я спрашиваю, похоже на этот вопрос , но в Ruby.

Я пишу модульные тесты для программы на Ruby, которая обрабатывает ввод из командной строки с использованием Trollop (хотя этот вопрос будетто же самое для любого другого парсера опций).

Метод, который я хочу протестировать, выглядит следующим образом:

def parse_args(args)
  Trollop::options(args) do
    # ... parse options based on flags
  end
end

В моей программе я вызываю parse_args(ARGV).В моем тесте я думал, что могу просто передать строку, разделенную на пробелы, но это не поведение ARGV.Сравните следующее:

./argv_example.rb -f -m "Hello world" --extra-args "-vvv extra verbose"
=> ["-f", "-m", "Hello world", "--extra-args", "-vvv extra verbose"]

'-f -m "Hello world" --extra-args "-vvv extra verbose"'.split
=> ["-f", "-m", "\"Hello", "world\"", "--extra-args", "\"-vvv", "extra", "verbose\""]

1 Ответ

11 голосов
/ 20 мая 2011

Существует Shellwords , если вы используете 1.9. Если вы не используете 1.9, но у вас есть Rails, вы получите Shellwords от Rails. В любом случае вы можете использовать Shellwords.shellwords для разбора строки, как это делает оболочка POSIX:

>> Shellwords.shellwords("Where is 'pancakes house'?")
=> ["Where", "is", "pancakes house?"]

Если у вас нет Rails или 1.9, вы можете просто взять shellwords.rb из Rails и использовать его.

Обновление : Похоже, Shellwords доступен в Ruby 1.8 (спасибо, Майкл Хол). Я получал неоднозначные результаты о том, какие конкретные версии имели это.

...