我创建了一个控制台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中暂停.奇怪的!我不明白为什么我会得到这种行为....
尝试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)
此解决方案有一些故障(例如,只有在输入后才会显示撬动提示)。
| 归档时间: |
|
| 查看次数: |
977 次 |
| 最近记录: |