Использование конвейера

Нередко возникают ситуации, когда нужно обработать вывод одной программы какой-то другой программой. Пользуясь перенаправлением ввода-вывода, можно сохранить вывод одной программы в файле, а потом направить этот файл на ввод другой программе. Однако такой способ не самый быстрый и требует создания временного файла для сохранения результата работы. То же самое можно сделать и более эффективно – перенаправить вывод не в файл, а непосредственнона стандартный ввод другой программе. В этом случае вместо двух команд потребуется только одна - программы передают друг другу данные "из рук в руки". В Linux такой способ передачи данных называется конвейер и обозначается символом «|». Конвейер - это свойство shell, которое позволяет связать последовательность команд в конвейер, где stdout первой команды посылается прямо на stdin второй команды и так далее.

Попробуйте получить список файлов и подкаталогов Вашего личного каталога, отсортированный в порядке обратном алфавитному. Для подобной сортировки у команды sort существует опция - r.

$ ls > file-list

Эта командная строка перенаправила выходной поток команды ls в файл file-list. При желании Вы можете убедиться в этом с помощью команд cat или more. Вторая команда сортирует содержимое файла file-list в указанном порядке и выводит его на экран:

$ sort - r file-list

В нашем примере необходимо направить стандартный выходной поток команды ls в стандартный входной поток команды sort. Используем для этого конвейер и введем:

$ ls | sort -r

На экране появиться отсортированный список файлов и подкаталогов. Эта командная строка намного короче и не требует создания ненужных временных файлов.

Другой полезный пример. Команда ls /usr/bin выдает на дисплей длинный список имен файлов, большинство из которых слишком быстро исчезают с экрана, и Вы не успеваете прочитать их. Подключите к просмотру перечня имен файлов каталога /usr/bin команду more:

$ ls /usr/bin | more

Теперь Вы можете постранично листать файл в свое удовольствие.

Вы можете связать в конвейер более двух команд. В примере используется команда head,котораяотображает первые заданные строки входного потока в стандартный выходной поток. Если Вы хотите отобразить на экране последнее имя из списка текущего каталога, упорядоченного по алфавиту, Вы можете ввести следующую командную строку:

$ ls | sort -r | head -1

где head -1 просто выдает первую строку (-1) получаемого входного потока (в данном случае это отсортированный в обратном порядке перечень имен файлов текущего каталога, выданных командой ls). Вот еще пример:

$ sort f1 | tee /dev/lp | tail -20

В этом случае будет отсортирован файл f1 и передан на печать, а 20 последних строк также будут выданы на экран.

 

Перенаправление с добавлением

Если файл уже существует, то перенаправление информации в него с помощью символа «>» окажется смертельным. Но, если вместо символа «>» использовать символ перенаправления «>>», выходной поток будет добавлен к содержимому указанного файла в конец, а не записан на место уже хранящейся в нем информации.

$ ls >> pokupki

После выполнения этой команды выходная информация команды ls будет добавлена в файл pokupki.

Имейте в виду, что перенаправления и конвейер - это средства, предоставляемые интерпретатором shell. Символы «>», «>>» и «|» - это синтаксис shell, и они не имеют никакого отношения к командам, как таковым.

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: