gpt4 book ai didi

ruby - 将每个 bash 输出通过管道传输到文件

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

有没有办法将每个输出通过管道传输到一个文件,比如监控终端以记录所有打印的内容?

此外,当我使用 tee 时,它似乎停止了实际程序的输出。我怎样才能改变这个?我想保持正常输出并只使用它的副本保存在文件中。

举个例子,我有这个 ruby​​ 脚本:

100.times do |i|
puts i
end

并运行 $ruby script.rb | tee output.txt 会很好地保存输出,但它只会在整个过程运行后打印出来。

最佳答案

用 Bash 来做

如果您使用的是 bash(根据您的标签),您可以运行 script -a -c "ruby your_script.rb"-f your_file.out

因此,例如,如果您编写了以下脚本,将其保存为 test.rb:

# test.rb
i = 0
while true do
i += 1
puts i
sleep 1
end

然后运行script -a -c "ruby test.rb"-f test.out,你可以每次刷新文件并看到它在一个一个递增每秒,即使脚本在媒体资源中;也就是说,还在运行。这是因为它正在“刷新”每个输出。

缺点:您只能使用 bash 中的 script 命令来执行此操作。在这方面,您创建了依赖关系;如果 script 不存在,或者它不像我机器上的 script 那样工作,那么这种方法可能根本不起作用。始终警惕依赖性。

在 Ruby 中实现

有时,您可能没有在 bash 上运行脚本,并且 script 可能不可用。然后怎样呢?好吧,您可以只创建一个打印到文件然后打印到标准输出的方法,而不管操作系统是什么。然后它会每次刷新文件以确保它是最新的。

# print_to_file.rb
class PrintOutputToFile
def self.file
@@file ||= File.open("my_output.log", "w")
end

def self.puts! some_data
file.write "#{some_data}\n"
file.flush
puts some_data
end
end

i = 0
while true do
i += 1
PrintOutputToFile.puts! i
sleep 1
end

缺点:这将在您每次运行时清除该文件。如果你想保留一个保存多次运行的长期日志,你可能需要修改这个小脚本。此外,如果您没有文件权限,此脚本将彻底崩溃。这不是旨在用于生产,而只是作为对有兴趣实现此类系统的人的概念验证。

另一种在 Ruby 中实现的方法

您也可以通过将旧的 puts 方法复制到 proc 中,然后覆盖核心 puts 方法以写入日志文件,但以调用原始 puts 方法结束。

@@old_puts = method(:puts).to_proc
def puts(output)
@@file ||= File.open("your_log.txt", "w")
@@file.write "#{output}\n"
@@old_puts.call output
@@file.flush
end

缺点:这超出了骇人听闻的一步,坦率地说,我不建议实际这样做,除非您真的非常知道自己在做什么并且绝对必须这样做。

关于ruby - 将每个 bash 输出通过管道传输到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27852705/

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