Если вы посмотрите на источник для 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=
к этому модулю так же, как описано выше.)
Альтернативы
Как Джошуа говоритв комментариях ниже альтернативой является переназначение $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)
, если вам нужно больше контроля.