Получать выполненную команду из FileUtils? - PullRequest
4 голосов
/ 02 июля 2010

Когда вы передаете флаг :verbose команде FileUtils, команда выводится в STDOUT. Есть ли способ перехватить команду, чтобы ее можно было зарегистрировать или использовать в другом месте?

Ответы [ 2 ]

4 голосов
/ 02 июля 2010

Если вы посмотрите на источник для 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), если вам нужно больше контроля.

0 голосов
/ 12 октября 2012

Чтобы добавить к ответу Майка (поскольку я не могу комментировать), я создал эту обертку def, если вы хотите получить вывод в виде строки:

def fileutil_out
    out = StringIO.new
    FileUtils.fileutils_output = out
    yield
    return out.string
end

mylog.info fileutil_out { FileUtils.chmod_R(0664, 'file.txt', :verbose => isVerbose) }

В итоге я не использовал еетак как я хотел вернуться к @fileutils_output ||= $stderr впоследствии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...