我有一个应用程序一直在运行,从服务器中不断地转储输出并将字符串发送到标准输出(stdout)。我想使用Ruby脚本处理这个输出,这些字符串以\n
为终止。
例如,我试图在命令行上运行以下命令:
myapp.exe | my_script.rb
...其中my_script.rb
定义如下:
while $stdin.gets
puts $_
end
我最终将使用正则表达式处理字符串并显示一些摘要数据,但现在我只是试图让基本功能正常工作。当我运行上面的代码时,我会收到以下错误:
my_script.rb:1:in `gets': Bad file descriptor (Errno::EBADF)
from my_script.rb:1
我正在运行Windows Server 2003 R2 SP2和Ruby 1.8.6。
如何在Ruby脚本中持续处理stdin?(持续处理指的是不处理文件,而是一直运行,直到我结束它。)
编辑:
我能够使这个工作,有点像。有几个问题阻碍着我。首先,使用Ruby处理来自另一个进程的管道输入的stdin可能在Windows 2003R2上无法正常工作。 Adrian提出的另一个方向是将我的脚本作为父进程运行,并使用popen
将其连接到myapp.exe
作为fork
ed子进程。不幸的是,在Windows中没有实现fork
,因此这也没有起作用。
最终我成功下载了 POpen4,这是一个在Windows上实现popen
的RubyGem。结合Adrian的建议,我编写了这个脚本,它可以处理来自myapp.exe
的输出:
文件:my_script.rb
require 'rubygems'
require 'popen4'
status =
POpen4::popen4("myapp.exe") do |stdout, stderr, stdin, pid|
puts pid
while s = stdout.gets
puts s
end
end
这个脚本会回显
myapp.exe
的输出,这正是我想要的。
gets
,而不是$stdin
。如果这行不通,你可能需要用另一个 Ruby 脚本的IO.popen
来检查myapp.exe
的输出是否含有不可打印字符。 - Adrianfork
无法工作,而popen
使用了fork
。有没有什么秘密咒语可以让它工作? - John Diblingmyapp.exe
以在某个特定行数后退出,然后使用%x
。 - Adrianpopen
的评论改成答案,我愿意接受它。 - John Dibling