gpt4 book ai didi

ruby-on-rails - ruby 管道、IO 和 stderr 重定向

转载 作者:数据小太阳 更新时间:2023-10-29 07:35:33 26 4
gpt4 key购买 nike

我希望有一个 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发送的

最佳答案

问题似乎是因为 stdout_writer 无限运行,stdin_reader 将永远没有机会从 stdout_writer 读取 STDOUT 作为管道,在这种情况下,正在等待 stdout_writerstdin_reader 开始读取之前完成。我通过将 while true 更改为 5.times do 来对此进行测试。如果你这样做,并等待 5 秒,./stdout_writer.rb | 的结果./stdin_reader.rb

reading...
writing...
got line writing...
~
got line ~
~
got line ~
~
got line ~
~
got line ~
~
got line ~

这不是您的代码本身的问题,而是根据 STDOUT | 执行 ruby​​ 的方式的问题。 STDIN 处理工作。

此外,我认为我从未像研究这个问题那样学到很多东西。感谢您的有趣练习。

关于ruby-on-rails - ruby 管道、IO 和 stderr 重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40120638/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com