Команды как файлы

Имеется интересная возможность, связанная с вводом/выводом. Любая программа, независимо от алгоритмического языка, на котором она написана, в принципе может читать со стандартного ввода, или записывать в стандартный вывод. Как это делается в языке Perl, мы обсуждали в разделе «Стандартные дескрипторы». Это свойство программы, когда она запущена, позволяет рассматривать её или как потребитель байтов, или, наоборот, как производитель. Всё это роднит запущенную программу с файлом, открытым соответственно или для записи, или для чтения.

Можно открыть любую программу как файл, или для чтения, или для записи. При открытии программа запускается. Кроме того, если программа открыта для записи, программисту на Perl становится доступен дескриптор. Всё, что записывается в него, запущенная программа прочитает, если захочет, со своего стандартного ввода. И наоборот, если программа открыта для чтения, из созданного при открытии дескриптора программа на Perl может читать как из обычного файла, и всё, что открытая программа отправляет на свой стандартный вывод, может быть прочитано.

Настало время примеров. Предположим, что в файле file.xz содержатся данные, сжатые компрессором xz. Разбираться в формате xz и программировать декомпрессию на Perl нет никакого желания, поэтому положимся на программу xzcat, написанную не нами. Чтобы вывести содержимое сжатого файла file.xz на стандартный вывод, применяют команду

% xzcat file.xz

Чтобы получить доступ к исходным данным (до сжатия), откроем команду для чтения. В знак того, что открывается именно команда, вторым параметром в процедуре open будет не '<', а '-|':

Perl
open my $input, '-|', 'xzcat file.xz';

Теперь читаем из дескриптора в переменной $input и делаем с прочитанными данными всё, что захочется.

Совершенно аналогично можно организовать обратный процесс — запись сжатых данных в файл:

Perl
open my $output, '|-', 'xz >file.xz';

Наконец, полный пример. Программа выводит квадраты последовательных целых неотрицательных чисел, но даёт пользователю возможность просматривать и листать в обоих направлениях выведенный текст при помощи программы-пейджера less. Для этого числа выводятся не на стандартный вывод, а в дескриптор, полученный при открытии программы less:

#!/usr/bin/perl

use warnings;

my $i=0;

open my $less, '|-', 'less';
while()
{
	print {$less} $i++**2, "\n";
}

Информатика-54© А. Н. Швец