Как получить доступ к исходной строке аргумента командной строки в Ruby? - PullRequest
4 голосов
/ 03 июня 2010

Я пытаюсь получить доступ к исходной строке аргумента командной строки в Ruby (то есть - не используя предварительно разделенный / разделенный массив ARGV). Кто-нибудь знает как это сделать? Например:

$> ruby test.rb command "line" arguments

Я хочу быть в состоянии определить, были ли в строке 'кавычки':

"command \"line\" arguments"

Есть советы? Заранее спасибо

Ответы [ 5 ]

6 голосов
/ 03 июня 2010

Насколько я могу судить, ruby ​​не удаляет эти двойные кавычки из вашей командной строки. Оболочка использует их для интерполяции содержимого в виде строки и передачи их в ruby.

Вы можете получить все, что получает рубин, вот так:

cmd_line = "#{$0} #{ARGV.join( ' ' )}"

Зачем вам нужно знать, что в кавычках? Можете ли вы использовать какой-либо другой разделитель (например, ':' или '#')?

Если вам нужно, вы можете передать двойные кавычки в ruby, избегая их:

$> ruby test.rb command "\"line\"" arguments

Приведенная выше переменная cmd_line получит следующую строку в этом случае:

test.rb comand "line" arguments
2 голосов
/ 03 июня 2010

В системах Unix оболочка командной строки (Bash, csh и т. Д.) Автоматически преобразует такой синтаксис в строки аргументов и отправляет их в исполняемый файл Ruby. Например, * автоматически расширяется до каждого файла в каталоге. Я сомневаюсь, что есть способ обнаружить это, и я спрашиваю, почему вы хотите это сделать.

2 голосов
/ 03 июня 2010

Я думаю, что это маловероятно, насколько я знаю, что все это обрабатывается оболочкой до того, как она передается в программу.

0 голосов
/ 26 мая 2016

В Ruby есть специальный модуль для этой цели.

http://ruby -doc.org / STDLIB-1.9.3 / libdoc / shellwords / RDoc / Shellwords.html

То, что вы хотите, это просто:

require 'shellwords'
Shellwords.join ARGV[1..-1]

: р

0 голосов
/ 21 мая 2014

Это должно помочь:

cmdline = ARGV.map{|x| x.index(/\s/) ? "\"#{x}\"":x}.join " "

Поскольку оболочка группирует слова внутри кавычек в один аргумент, нам нужно проверить, есть ли в каждом аргументе пробел, и, если он есть, поставить вокруг него кавычки.

Он по-прежнему не будет сохранять символы подстановки (*), переменные env ($ VAR) и другие вещи, которые расширяет оболочка перед передачей в сценарий.

Чтобы иметь возможность передавать команду как есть, без расширений, вам придется прибегнуть к ее передаче через IO, например echo "ls *" | my_script.rb

...