2017-03-01 1 views
0

Ruby의 OptionParser에서 명령 줄에 지정된 정확한 옵션 플래그를 얻고 싶습니다.OptionParser 내에서 지정된 옵션 플래그를 얻는 방법

예를 들어, 가정 나는 다음과 같은 코드를 가지고 :

parser = OptionParser.new {                         
    |opts|                                                          
    opts.on('-f', '--file FILE', 'filename') {                        
    |arg|                             
    $filename = arg                         
    # Here I'd like to know whether '-f' or '--file' was entered 
    # on the command line.                    
    } 
    # ... etc. ... 
} 

나는 사용자가 '-f'또는 명령 줄에 '--file'입력 할 일이 있는지 알고 싶습니다. 두 개의 별도의 opts.on 블록을 작성하지 않고 이것이 가능합니까?

+3

기다립니다,하지만 왜? – ndn

+0

@ 사용자의 행동 분석? :) – mudasobwa

+0

@mudasobwa, CLI? xd – ndn

답변

0

OptionParser.new 블록 안에있을 때 플래그를 전달할 수 있다고 생각하지 않습니다. 그 시점에서 너무 늦었습니다. 그러나 OptionParser가 명령 줄을 구문 분석하기 전에 전달되는 내용을보고 볼 수 있습니다.

ARGV에는 원시 명령 줄이 있습니다.

ARGV.grep(/^-/) # => ["-i", "-j"] 
: 그것은 플래그를 잡아 아주 쉽게되고,

["-i", "1", "-j", "2"] 

과 :

foo -i 1 -j 2 

다음 ARGV이 포함됩니다 : 예를 들어,이 명령 줄 몇 가지 코드를 호출하는 경우

Ruby를위한 다른 OptionParser와 유사한 도구가 있는데, 사용되는 플래그에 액세스 할 수있는 도구가있을 수 있습니다.하지만 지금까지 신경 쓰지 않았던 이유를 생각할 수 없습니다. 당신이 OptionParser 사용하는 방법을 이해하지 못하는 것 같은 코드를 보면 보인다 :

parser = OptionParser.new {                         
    |opts|                                                          
    opts.on('-f', '--file FILE', 'filename') {                        
    |arg|                             
    $filename = arg                         
    # Here I'd like to know whether '-f' or '--file' was entered 
    # on the command line.                    
    } 
    # ... etc. ... 
} 

를 대신 그런 식으로 일을, 나는 그것을 쓸 것 :

options = {} 
OptionParser.new do |opts|                                                          
    opts.on('-f', '--file FILE', 'filename') { |arg| options[:filename] = arg } 
end.parse! 

if options[:filename] 
    puts 'exists' if File.exist?(options[:filename]) 
end 

을 그리고, 나중에 코드에서 options 해시를 확인하여 -f 또는 --file 옵션 중 하나가 주어 졌는지, 그 값이 무엇인지 확인할 수 있습니다. -f 또는 --file 중 하나 또는 그 이상이 중요하지 않아야합니다.

그 다음 않는 당신은 그들이 별명 것 것처럼 두 플래그를 구분하는 대신 그들을 치료해야하는 경우 :

options = {} 
OptionParser.new do |opts|                                                          
    opts.on('-f', 'filename') { |arg| options[:f] = arg } 
    opts.on('--file FILE', 'filename') { |arg| options[:file] = arg } 
end.parse! 

if options[:file] || options[:f] 
    puts 'exists' if File.exist?(options[:file] || options[:f]) 
end 
+0

예, 저는 이와 비슷한 것을 해왔습니다. 정확한 옵션 플래그를 얻는 것이 불가능하다는 것을 알았습니다. 나는 정확한 플래그 값을 얻고 자하는 내 자신 만의 특이한 이유가 있기 때문에이 특정 응용 프로그램에 대해 OptionParser를 포기하고 "손으로"명령 줄 인수를 구문 분석합니다 (즉,이 경우 ARGV를 직접 탐색하여). – HippoMan

관련 문제