从从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
知道,你的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提示),但总体思路很清楚。