ruby – 从FileUtils获取执行的命令?
将: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 =>如果您想捕获大量命令,则可以使用此命令,而不是每次都指定选项. (您需要以与上面相同的方式将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)本身. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |