Книга: Программирование на языке 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"
Есть, конечно, и много других способов изменить стандартное поведение обратных кавычек.
- Пример 13-2. невидимый пароль: Отключение эхо-вывода на терминал
- Перехват ошибок
- СТРУКТУРА ПРОСТОЙ ПРОГРАММЫ
- ПРИМЕР ПРОСТОЙ ПРОГРАММЫ НА ЯЗЫКЕ СИ
- Включение и отключение синхронного вывода
- 1.2.5. Пример программы
- 24.7. Использование программы-твикера
- 2. Правила вывода Армстронга
- 3. Производные правила вывода
- 1.6 Драйверы и буферы ввода-вывода
- Часть III Прикладные программы
- Глава 6 BIOS – базовая система ввода-вывода