我希望能够编写一个 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的Upstart服务 script1.rb | script2.rb
其中script1发送一条消息,而script2验证该消息是否由script1发送。