gpt4 book ai didi

ruby - 从 FileUtils 获取执行的命令?

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

当您将 :verbose 标志传递给 FileUtils 命令时,该命令会打印到 STDOUT。有没有办法捕获命令,以便可以将其记录或在其他地方使用?

最佳答案

如果您查看 FileUtils 的源代码,它使用以下方法进行详细输出:

def fu_output_message(msg)   #:nodoc:
@fileutils_output ||= $stderr
@fileutils_label ||= ''
@fileutils_output.puts @fileutils_label + msg
end

即它正在将消息写入 @fileutils_output,默认情况下它使用 $stderr。似乎没有一种方法可以改变 @fileutils_output 但你可以添加一个:

module FileUtils
def FileUtils.fileutils_output=(new_out)
@fileutils_output = new_out
end
end

然后,如果您想将命令捕获到一个文件中,您可以这样做:

my_fu_log = open('fu_log.log', 'w')
FileUtils.fileutils_output = my_fu_log
# FileUtils operations with :verbose => true here
my_fu_log.close
FileUtils.fileutils_output = $stderr # restore writing to stderr if you want

或者如果你想把它们放在一个字符串中,你可以这样做:

log = StringIO.new
FileUtils.fileutils_output = log
# FileUtils operations with :verbose => true here
# commands are in log.string

此外,还有一个模块 FileUtils::Verbose,它基本上包括 FileUtils(因此具有所有相同的方法)但默认选项为 :verbose = > true 所以如果你想捕获很多命令,你可以使用它而不是每次都指定选项。 (您需要以与上述相同的方式将 fileutils_output= 方法添加到此模块。)

备选方案

作为Joshua在下面的评论中说,另一种方法是重新分配 $stderr 但正如他所说,这确实意味着写入 stderr 的所有内容(不仅仅是 FileUtils)都会被重定向。如果所有 FileUtils 操作都同时发生,中间没有任何其他操作,那么这可能不是问题。所以一些事情是这样的:

orig_stderr = $stderr # keep reference to original stderr
$stderr = my_fu_log
# use FileUtils here
$stderr = orig_stderr # restore stderr

最后,如果您需要更多控制,您可以重新打开 FileUtils 并覆盖 fu_output_message(msg) 本身。

关于ruby - 从 FileUtils 获取执行的命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3163585/

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