Книга: Программирование на языке Ruby

14.1.2. Перехват вывода программы

14.1.2. Перехват вывода программы

Простейший способ перехватить информацию, выведенную программой, — заключить команду в обратные кавычки, например:

listing = `ls -l` # Одна строка будет содержать несколько строчек (lines).
now = `date`      # "Mon Mar 12 16:50:11 CST 2001"

Обобщенный ограничитель %x вызывает оператор обратных кавычек (который в действительности является методом модуля Kernel). Работает он точно так же:

listing = %x(ls -l)
now = %x(date)

Применение %x бывает полезно, когда подлежащая исполнению строка содержит такие символы, как одиночные и двойные кавычки.

Поскольку обратные кавычки — это на самом деле метод (в некотором смысле), то его можно переопределить. Изменим его так, чтобы он возвращал не одну строку, а массив строк. Конечно, при этом мы создадим синоним старого метода, чтобы его можно было вызвать.

alias old_execute `
def `(cmd)
 out = old_execute(cmd) # Вызвать исходный метод обратной кавычки.
 out.split("n") # Вернуть массив строк!
end
entries = `ls -l /tmp`
num = entries.size          # 95
first3lines = %x(ls -l | head -n 3)
how_many = first3lines.size # 3

Как видите, при таком определении изменяется также поведение ограничителя %x.

В следующем примере мы добавили в конец команды конструкцию интерпретатора команд, которая перенаправляет стандартный вывод для ошибок в стандартный вывод:

alias old_execute `
def `(cmd)
 old_execute(cmd + " 2>&1")
end
entries = `ls -l /tmp/foobar`
# "/tmp/foobar: No such file or directoryn"

Есть, конечно, и много других способов изменить стандартное поведение обратных кавычек.

Оглавление книги


Генерация: 1.257. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз