2011-01-20 18 views
11

Từ:Tôi làm cách nào để chuyển <arguments> sang IRB nếu tôi không chỉ định <programfile>?

irb --help 

Cách sử dụng: irb.rb [options] [programfile] [luận]


Tôi biết tôi có thể vượt qua đối số argv nếu tôi bao gồm programfile

ví dụ:

irb test.rb A B C 

nơi test.irb chỉ đơn giản là "p argv"

sản xuất:

[ "a", "b", "c"]


Làm programfile được con trong DOS ... tôi có thể làm sau

irb con A B C 
con(main):001:0> ARGV 

sản xuất:

argv
=> [ "A", "B", "C"]

nhưng đây là hệ thống phụ thuộc và có tác dụng phụ của đầu vào lặp lại :-(

gì tôi thực sự muốn là một cái gì đó như

irb -- a b c 

BTW: tôi biết tôi có thể thiết argv bên IRB nhưng tôi ý định của tôi là bí danh đặc biệt == IRB -rSpecialLibrary" vì vậy tôi có thể làm điều gì đó như:

special A B C 
<input goes here> 

Mọi đề xuất?

+0

Đó là một chuỗi mẫu và ví dụ được định dạng sai. Vui lòng thử chỉnh sửa lại và định dạng bằng cách sử dụng các ví dụ được cung cấp trong [Trợ giúp chỉnh sửa] (http://stackoverflow.com/editing-help). Bình thường tôi sẽ giúp làm sạch nó cho bạn, nhưng có quá nhiều, và tôi không biết ý định của bạn. –

+0

Tại sao bạn muốn chuyển đối số nếu bạn có thể đặt đối số trong irb? Các đối số được sử dụng bởi SpecialLibrary? – cldwalker

+0

Tôi muốn bí danh "đặc biệt == irb -rSpecialLibrary" vì vậy tôi có thể làm một cái gì đó như "đặc biệt A B C" như minh họa ở trên. – DMisener

Trả lời

0

giải pháp khá lạ là để tạo ra tập tin với các biến

# defaults.rb 
@a = "hello world" 

# terminal 
=> irb -r defaults.rb 
irb=> @a 
irb=> "hello world" 
+0

Điều này không dễ dàng cho phép các tham số truyền vào một bản sao vỏ dựa trên IRB tương tác. – DMisener

+0

Tôi nghĩ rằng bạn đã hiểu sai câu hỏi. Đây là về việc điền vào hằng số ARGV được điền với các tham số được truyền trên dòng lệnh. – mydoghasworms

8

Nhìn vào nguồn gốc của irb thực thi:

#!/usr/bin/env ruby 
require "irb" 

if __FILE__ == $0 
    IRB.start(__FILE__) 
else 
    # check -e option 
    if /^-e$/ =~ $0 
    IRB.start(__FILE__) 
    else 
    IRB.setup(__FILE__) 
    end 
end 

Các tại nguồn của Mô-đun IRB:

# File lib/irb/init.rb, line 15 
    def IRB.setup(ap_path) 
    IRB.init_config(ap_path) 
    IRB.init_error 
    IRB.parse_opts 
    IRB.run_config 
    IRB.load_modules 

    unless @CONF[:PROMPT][@CONF[:PROMPT_MODE]] 
     IRB.fail(UndefinedPromptMode, @CONF[:PROMPT_MODE]) 
    end 
    end 

Down để parse_opts, phương pháp vấn đề của chúng tôi:

# File lib/irb/init.rb, line 126 
    def IRB.parse_opts 
    load_path = [] 
    while opt = ARGV.shift 
     case opt 
     when "-f" 
     @CONF[:RC] = false 
     when "-m" 
     @CONF[:MATH_MODE] = true 
     when "-d" 
     $DEBUG = true 
     when /^-r(.+)?/ 
     opt = $1 || ARGV.shift 
     @CONF[:LOAD_MODULES].push opt if opt 
     when /^-I(.+)?/ 
     opt = $1 || ARGV.shift 
     load_path.concat(opt.split(File::PATH_SEPARATOR)) if opt 
     when '-U' 
     set_encoding("UTF-8", "UTF-8") 
     when /^-E(.+)?/, /^--encoding(?:=(.+))?/ 
     opt = $1 || ARGV.shift 
     set_encoding(*opt.split(':', 2)) 
     when "--inspect" 
     @CONF[:INSPECT_MODE] = true 
     when "--noinspect" 
     @CONF[:INSPECT_MODE] = false 
     when "--readline" 
     @CONF[:USE_READLINE] = true 
     when "--noreadline" 
     @CONF[:USE_READLINE] = false 
     when "--echo" 
     @CONF[:ECHO] = true 
     when "--noecho" 
     @CONF[:ECHO] = false 
     when "--verbose" 
     @CONF[:VERBOSE] = true 
     when "--noverbose" 
     @CONF[:VERBOSE] = false 
     when /^--prompt-mode(?:=(.+))?/, /^--prompt(?:=(.+))?/ 
     opt = $1 || ARGV.shift 
     prompt_mode = opt.upcase.tr("-", "_").intern 
     @CONF[:PROMPT_MODE] = prompt_mode 
     when "--noprompt" 
     @CONF[:PROMPT_MODE] = :NULL 
     when "--inf-ruby-mode" 
     @CONF[:PROMPT_MODE] = :INF_RUBY 
     when "--sample-book-mode", "--simple-prompt" 
     @CONF[:PROMPT_MODE] = :SIMPLE 
     when "--tracer" 
     @CONF[:USE_TRACER] = true 
     when /^--back-trace-limit(?:=(.+))?/ 
     @CONF[:BACK_TRACE_LIMIT] = ($1 || ARGV.shift).to_i 
     when /^--context-mode(?:=(.+))?/ 
     @CONF[:CONTEXT_MODE] = ($1 || ARGV.shift).to_i 
     when "--single-irb" 
     @CONF[:SINGLE_IRB] = true 
     when /^--irb_debug=(?:=(.+))?/ 
     @CONF[:DEBUG_LEVEL] = ($1 || ARGV.shift).to_i 
     when "-v", "--version" 
     print IRB.version, "\n" 
     exit 0 
     when "-h", "--help" 
     require "irb/help" 
     IRB.print_usage 
     exit 0 
     when "--" 
     if opt = ARGV.shfit 
      @CONF[:SCRIPT] = opt 
      $0 = opt 
     end 
     break 
     when /^-/ 
     IRB.fail UnrecognizedSwitch, opt 
     else 
     @CONF[:SCRIPT] = opt 
     $0 = opt 
     break 
     end 
    end 
    if RUBY_VERSION >= FEATURE_IOPT_CHANGE_VERSION 
     load_path.collect! do |path| 
     /\A\.\// =~ path ? path : File.expand_path(path) 
     end 
    end 
    $LOAD_PATH.unshift(*load_path) 

    end 

Nó là hardcoded để mất rằng tùy chọn như tên kịch bản (@CONF [: SCRIPT] = opt). May mắn thay, đây là Ruby. Ý tưởng đầu tiên tôi đã sử dụng một kịch bản lệnh khác để khởi chạy IRB để thay đổi mô đun đầu tiên.

~/bin/tùy chỉnh-IRB:

#!/usr/bin/env ruby 
require 'irb' 
module IRB 
    class << self 
    # sort of lame way to reset the parts we don't like about 
    # parse_opts after it does the parts we do like 
    def parse_opts_with_ignoring_script 
     arg = ARGV.first 
     script = $0 
     parse_opts_without_ignoring_script 
     @CONF[:SCRIPT] = nil 
     $0 = script 
     ARGV.unshift arg 
    end 
    alias_method :parse_opts_without_ignoring_script, :parse_opts 
    alias_method :parse_opts, :parse_opts_with_ignoring_script 
    end 
end 

if __FILE__ == $0 
    IRB.start(__FILE__) 
else 
    # check -e option 
    if /^-e$/ =~ $0 
    IRB.start(__FILE__) 
    else 
    IRB.setup(__FILE__) 
    end 
end 

Bạn có thể khởi này với custom-irb foo bar baz và argv sẽ ['foo', 'bar', 'baz'].

+0

+1 Xấu xí, nhưng hoàn thành công việc. Đó là Susan Boyle của kịch bản. – zetetic

+1

Đẹp hack @scragz. Nó có thể làm cho một số ý nghĩa để cho phép 'irb - a b c' như một cách để bỏ qua các yêu cầu tập tin nhưng câu trả lời của bạn bao gồm các câu hỏi độc đáo. – noodl

+0

Có cho phép irb - a b c giải quyết vấn đề áp phích ban đầu và loại bỏ mã trùng lặp. Bất cứ ai quan tâm để truy vấn người bảo trì IRB hiện tại để có bản vá nhanh? – DMisener

0

Bạn có thể tạo tệp sửa đổi ARGV và sau đó sử dụng '-r' để bao gồm nó.

$ echo 'ARGV = ["testing", "1","2","3"]' > ~/blah.rb && irb -r ./blah test.rb 
/home/me/blah.rb:1: warning: already initialized constant ARGV 
test.rb(main):001:0> require 'pp' 
=> true 
test.rb(main):002:0* pp ARGV 
["testing", "1", "2", "3"] 
=> ["testing", "1", "2", "3"] 
test.rb(main):003:0> 

Bạn thậm chí có thể chuyển hướng nó đến ~/.irbrc của bạn và bỏ qua '-r ./blah'.

Các vấn đề liên quan