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

Rya*_*cox 10 ruby pry

我创建了一个控制台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)
Run Code Online (Sandbox Code Playgroud)

当我用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)>
Run Code Online (Sandbox Code Playgroud)

大!我可以随心所欲地执行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)>
% 
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*kin 6

尝试ARGF简单:

require 'rubygems'
require 'pry'
binding.pry
Run Code Online (Sandbox Code Playgroud)

现在,IO内部ARGF.read并没有涵盖操作,这显然是哪里出了问题。ARGF被“粘”到STDIN,因此传递给它的任何内容STDIN都直接进入pry的输入。

我不确切知道,您的file.txt部队中有什么指示会试图退出,但是有一条。


更新

看起来,如果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
Run Code Online (Sandbox Code Playgroud)

此解决方案有一些故障(例如,只有输入才会显示撬动提示)。