Как передать строку *.* в ruby ​​в качестве параметра командной строки?

код:

  #test_argv.rb
  puts "length: #{ARGV.length} "
  ARGV.each do |a|
    puts "Argument: #{a}"
  end

Если я предоставлю строку "*.*" (с кавычками или без них) при вызове вышеуказанного, я получу следующий вывод:

  C:\test>test_argv *.*
  length: 5
  Argument: afile.TXT
  Argument: bfile.TXT
  Argument: cfile.TXT
  Argument: dfile.TXT
  Argument: somethingelse.TXT

т. е. список файлов в каталоге c:\test.

Другие значения, такие как "s*.*", возвращают что-то еще.TXT, как и следовало ожидать, если вы выполняли операции с файлами, но я этого не делаю.

Но это ведет себя так, как и следовало ожидать:

  C:\test>test_argv asdf
  length: 1
  Argument: asdf

Итак, мой вопрос: как я могу создать удобный скрипт, который будет принимать "*.*" (и т. д.) в качестве параметра командной строки? Кроме того, где это задокументировано/объяснено?

Изменить: это происходит в Windows и Linux, 1.8.7 и 1.9.2.


person davej    schedule 07.06.2011    source источник
comment
решение для Windows — использовать одинарную кавычку, например, ' * . * '.   -  person davej    schedule 07.06.2011
comment
решение для Linux, как сообщил tadman, заключается в заключении либо в двойные, либо в одинарные кавычки.   -  person davej    schedule 07.06.2011


Ответы (1)


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

test_argv "*.*"

Кавычки должны избегать преждевременного раскрытия аргументов командной строки.

person tadman    schedule 07.06.2011
comment
+1. Поведение, которое видит OP, - это подстановка, выполняемая оболочкой - person Abe Voelker; 07.06.2011
comment
Чтобы расширить это, проблема заключается в том, что ваша оболочка интерпретирует последовательность подстановочных знаков и расширяет ее до списка имен файлов, прежде чем передать ее Ruby. На самом деле ваш сценарий ничего не может с этим поделать, единственный способ избежать такого поведения - экранировать специальные символы в оболочке (синтаксис для этого может варьироваться от оболочки к оболочке). - person bta; 07.06.2011
comment
Как я уже говорил в своем посте, с кавычками или без них поведение одинаково. Попытайся. Кроме того, для людей ТАК, есть ошибка при публикации: я отправил Если я указываю строку, за которой следуют кавычки, звездочка, точка, звездочка, кавычка, но две звездочки не появляются; они все еще там, потому что я могу увидеть их, если отредактирую свой пост. - person davej; 07.06.2011
comment
мой плохой: завернутый в кавычки, он работает как хотелось бы в Linux, но не в Windows, т. Е. Windows игнорирует кавычки и выполняет подстановку - person davej; 07.06.2011
comment
@davej - я исправил вашу проблему с представлением строки в SO. Вам нужно экранировать его косой чертой, т.е. \*.* - person Daemin; 07.06.2011