2011-05-20 20 views
8

Bir ARGV benzeri diziye bir dizi komut satırı bağımsız değişkenini bölmeme izin verecek bir Ruby yöntemi veya normal bir ifade istiyorum. Ne soruyorum this question, ama Ruby'de benzer.ARGV doldurmak için kabukların yaptığı bir dizeyi nasıl bölebilirim?

Trollop kullanarak komut satırı girişini işleyen bir Ruby programına ilişkin birim testleri yazıyorum (bu soru başka herhangi bir seçenek ayrıştırıcısı için aynı olsa da).

Ben test etmek istiyorum yöntem aşağıdaki gibidir: Benim programda

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

, ben parse_args(ARGV) diyoruz. Testimde, boşluklara bölünmüş bir dizgeyi geçebileceğimi düşündüm, fakat bu ARGV'nin davranışı değil. Eğer 1.9 kullanıyorsanız

./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\""] 

cevap

11

Shellwords vardır: Aşağıdaki karşılaştırın. Eğer 1.9 kullanmıyorsanız ancak Rails'iniz varsa, Rails'den Shellwords elde edersiniz. Her iki durumda da, bir POSIX kabuk yaptığı gibi bir dize ayrıştırmak için Shellwords.shellwords kullanabilirsiniz:

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

Eğer Rails yoksa veya 1.9 sonra muhtemelen sadece Raylar gelen shellwords.rb kapmak ve kullanmak olsaydı.

Güncelleştirme: Shellwords'un Ruby 1.8'de (teşekkür ederim Michael Khol) kullanılabilir. Hangi özel sürümlerin olduğu konusunda muğlak sonuçlar elde ediyordum.

+4

+1, ancak bunun 1.8.7'de de çalıştığını belirtmek isteriz. (ve hatta 1.8.6, sadece denedim). http://www.ruby-doc.org/ruby-1.8/classes/Shellwords.html –

+0

@Michael: Teşekkürler, hangi sürümlerde mevcut olduğu konusunda muğlak bilgiler alıyordum, bu yüzden yalnızca doğrulayabildiğim şeyleri dahil ettim. –

İlgili konular