如果我没有指定,如何将传递给IRB?

以来:

irb --help 

用法:irb.rb [options] [programfile] [参数]


我知道如果我包含一个程序文件,我可以将参数传递给ARGV

例如:

 irb test.rb ABC 

test.irb只是“p ARGV”

生产:

[“a”,“b”,“c”]


使程序文件成为DOS中的con …我可以做以下

 irb con ABC con(main):001:0> ARGV 

生产:

ARGV
=> [“A”,“B”,“C”]

但这是系统依赖的,并具有回声输入的副作用:-(

我真正喜欢的是什么

 irb -- abc 

顺便说一句:我知道我可以在irb中设置ARGV,但我的意图是别名特殊== irb -rSpecialLibrary“所以我可以这样做:

 special ABC  

有什么建议?

查看irb可执行文件的来源:

 #!/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 

在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 

下到parse_opts ,我们的问题方法:

 # 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 

将该选项作为脚本名称(@CONF [:SCRIPT] = opt)进行硬编码。 幸运的是,这是Ruby。 我的第一个想法是使用不同的脚本来启动IRB,首先修改模块。

〜/斌/定制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 

您可以使用custom-irb foo bar baz启动它,ARGV将是['foo', 'bar', 'baz']

很奇怪的解决方案是用变量创建文件

 # defaults.rb @a = "hello world" 

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

您可以创建一个修改ARGV的文件,然后使用’-r’来包含它。

 $ 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> 

你甚至可以将它重定向到你的〜/ .irbrc并省略’-r ./blah’。