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

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 directory\n".

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