当从一个从stdin读取的Ruby脚本中调用时,撬不停

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

当我通过一个文件(Pry暂停)但是失败时(Pry不停止并且刚刚退出Ruby),当我使用stdin传递我的数据时,这很好用。

这很奇怪,任何人都知道为什么? 我想通过stdin传递数据并让Pry暂停。

看一个脚本示例:

require 'rubygems'
require 'pry'


def pry_it(str)
    binding.pry
end

pry_it(ARGF.read)

当我用ARGV中的一个文件调用这个应用程序时,我得到了我的正确答案 - pry暂停

% 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

现在, IO操作不在ARGF.read内部,因此这里显然有什么问题。 ARGFSTDIN “粘在一起”,因此传递给STDIN任何内容都直接发送给pry的输入。

我不知道,你的file.txt哪条指令强制pry退出,但有一条指令。


UPD它看起来好像ruby脚本在stdin上产生任何东西(例如通过管道), $stdinSTDIN都被设置到了这个管道,从而搞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提示符),但总体思路很明确。

链接地址: http://www.djcxy.com/p/87653.html

上一篇: Pry not stopping when called from a Ruby script that reads from stdin

下一篇: Reactive Banana: State monad or not?