我希望有一个 ruby 程序(一个 rake 任务)观察另一个 rake 任务的输出。输出写入器输出到 stderr。我想读一下这些行。我很难设置它。如果我有一个作家(stdout_writer.rb)不断打印一些东西:
#!/usr/bin/env ruby
puts 'writing...'
while true
$stdout.puts '~'
sleep 1
end
以及读取它并回显的文件(stdin_reader.rb):
#!/usr/bin/env ruby
puts 'reading...'
while input = ARGF.gets
puts input
input.each_line do |line|
begin
$stdout.puts "got line #{line}"
rescue Errno::EPIPE
exit(74)
end
end
end
我试图让他们一起工作,但什么也没有发生:
$ ./stdout_writer.rb 2>&1 | ./stdin_reader.rb
$ ./stdout_writer.rb | ./stdin_reader.rb
什么都没有...虽然如果我只是回显到 stdin_reader.rb,我会得到我所期望的:
piousbox@e7440:~/projects/opera_events/sendgrid-example-operaevent$ echo "ok true" | ./stdin_reader.rb
reading...
ok true
got line ok true
piousbox@e7440:~/projects/opera_events/sendgrid-example-operaevent$
那么我将如何设置一个将 stderr 通过管道传输到其中的脚本,以便它可以逐行读取它?附加信息:这将是一个 ubuntu 新贵服务script1.rb | script2.rb
其中 script1 发送一条消息,script2 验证该消息是否由 script1 发送
问题似乎是stdout_writer
无限运行,stdin_reader
永远不会有机会阅读STDOUT
from stdout_writer
在这种情况下,管道正在等待stdout_writer
之前完成stdin_reader
开始阅读。我通过改变来测试这个while true
to 5.times do
。如果您这样做,并等待 5 秒钟,结果为./stdout_writer.rb | ./stdin_reader.rb
is
reading...
writing...
got line writing...
~
got line ~
~
got line ~
~
got line ~
~
got line ~
~
got line ~
这不是代码本身的问题,而是 ruby 执行方式的问题STDOUT | STDIN
处理工程。
另外,我认为我所学到的东西还不如研究这个问题所学到的东西多。感谢您进行有趣的练习。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)