无需iruby/Jupyter,如何将Ruby脚本与输出保存至同一文件?
可行的简便替代方案
完全理解你不想折腾iruby和Jupyter的心情——有时候我们只需要一个轻量直接的工具,就能把Ruby代码和它的运行结果按irb风格打包到文件里。这里有两个简单的方案,你可以按需选择:
方案一:用系统自带的irb工具快速实现
其实你可以直接用Ruby自带的irb命令,配合一点命令行处理,就能得到想要的输出格式,完全不用额外安装工具。
假设你的hello.rb内容是:
puts "hello world" 2 + 3
只需要在终端运行这条命令:
irb --simple-prompt < hello.rb | sed 's/irb(main):[0-9]*:[0-9]*> /irb > /' > output.txt
这条命令的作用是:
irb --simple-prompt < hello.rb:让irb以简单提示符模式执行hello.rb里的代码,输出包含输入代码和运行结果sed 's/irb(main):[0-9]*:[0-9]*> /irb > /':把irb默认带的行号(比如irb(main):001:0>)替换成你想要的irb >格式- 最后把结果重定向到
output.txt
生成的output.txt内容会和你期望的完全一致:
irb > puts "hello world" hello world => nil irb > 2+3 => 5
方案二:自己写一个轻量Ruby脚本(更灵活可控)
如果想要完全自定义输出格式,或者担心依赖外部命令(比如sed),可以自己写一个几十行的小Ruby脚本作为工具,逻辑非常简单:
保存下面的代码为irbliketool.rb:
#!/usr/bin/env ruby # 检查输入参数 input_file = ARGV.first unless input_file && File.exist?(input_file) puts "Usage: #{$0} <ruby_script.rb>" exit 1 end # 读取脚本内容 code = File.read(input_file) # 用Ruby的Ripper解析器拆分代码为独立表达式(比简单按行分割更可靠) require 'ripper' def extract_expressions(code) tokens = Ripper.lex(code) expressions = [] current_expr = [] tokens.each do |line, col, type, str| current_expr << str # 遇到换行或分号时,结束当前表达式 if type == :on_nl || type == :on_semicolon expr = current_expr.join.strip expressions << expr unless expr.empty? current_expr = [] end end # 处理最后一个未闭合的表达式 expr = current_expr.join.strip expressions << expr unless expr.empty? expressions end # 模拟irb风格执行并输出 extract_expressions(code).each do |expr| puts "irb > #{expr}" begin result = eval(expr) puts "=> #{result.inspect}" rescue => e puts "=> #{e.class}: #{e.message}" end end
然后给脚本添加执行权限:
chmod +x irbliketool.rb
之后就可以像你期望的那样使用:
./irbliketool.rb hello.rb > output.txt
这个脚本的好处是:
- 可以自由修改输出格式(比如调整提示符样式)
- 用Ruby的解析器拆分表达式,比简单按行分割更准确(比如处理跨多行的表达式)
- 自带错误处理,执行出错时会输出错误信息
⚠️ 注意:因为脚本用了eval,只用来处理你自己编写的、信任的Ruby代码,不要用它执行未知来源的脚本,避免安全风险。
内容的提问来源于stack exchange,提问作者kojix2
相关产品推荐
相关产品推荐

