从从stdin读取的Ruby脚本调用时不要停止

我创建了一个控制台 Ruby脚本,它使用ARGF从文件或stdin加载数据,然后调用Pry.

当我使用stdin传递数据时,当我传入文件(Pry暂停)但失败(Pry不会停止并退出Ruby)时,这很有用.

这很奇怪,有谁知道为什么?我想通过stdin传递数据并让Pry暂停.

看,一个示例脚本:

require 'rubygems'
require 'pry'


def pry_it(str)
    binding.pry
end

pry_it(ARGF.read)

当我用ARGV中的文件调用此应用程序时,我得到了正确的答案 – 撬开暂停

% bundle exec ruby pry_test.rb file.txt

From: /Users/wilcoxr/Development/json_pry/pry_test.rb @ line 8 Object#pry_it:

    6: def pry_it(str)
    7:
 => 8:  binding.pry
    9: end

[1] pry(main)>

大!我可以随心所欲地执行Pry命令

当我尝试使用STDIN将数据发送到我的工具时:

% cat file.txt | bundle exec ruby pry_test.rb

From: /Users/wilcoxr/Development/json_pry/pry_test.rb @ line 8 Object#pry_it:

    6: def pry_it(str)
    7:
 => 8:  binding.pry
    9: end

[1] pry(main)>
%

仔细观察:注意我回到了我的shell提示符,而不是在IRB中暂停.奇怪的!我不明白为什么我会得到这种行为….

解决方法

嘿.这次高尔夫花了我十分钟才明白是什么驱使这个剧本疯狂.

尝试简单的ARGF:

require 'rubygems'
require 'pry'
binding.pry

现在,ARGF.read内部没有覆盖IO操作,这里明显出现了什么问题. ARGF被“粘合”到STDIN,因此传递给STDIN的任何内容都直接转到pry的输入.

我不确切知道,你的file.txt中的哪些指令强迫pry退出,但有一个.

UPD看起来如果ruby脚本在stdin上产生任何东西(例如通过管道),$stdin和STDIN都被设置为这个管道,弄乱了pry的“我在哪里跑”检测到了.

我想出了这个不那么优雅的解决方案:

# read input from ARGF
text = ARGF.read

# prepare new stdin to satisfy pry
pry_fd_stdin = IO.sysopen("/dev/tty")
pry_stdin = IO.new(pry_fd_stdin,"r")

# load pry and cheat it with our stdio
require 'pry'
Pry.config.input = pry_stdin

binding.pry

这个解决方案有一些小故障(例如,输入后只显示pry提示),但一般的想法很清楚.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...