加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 02:27:06 所属栏目:百科 来源:网络整理
导读:将:verbose标志传递给FileUtils命令时,该命令将打印到STDOUT.有没有办法捕获命令,以便可以记录或在其他地方使用? 解决方法 如果查看FileUtils的源代码,它会使用以下方法来执行详细输出: def fu_output_message(msg) #:nodoc: @fileutils_output ||= $stde
将: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)本身.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读