12. Потоки ввода-вывода, перенаправление ввода-вывода. Программы-фильтры - назначение, особенности, примеры.
Каждая программы, запущенная из shell, получает три открытых потока ввода/вывода, которые по умолчанию ассоциируются с терминалом.
Потоки задаются номерами(дескрипторы):
- 0 стандартный поток ввода, ассоциируется с клавиатурой
- 1 стандартный поток вывода, ассоциируется с экраном
- 2 стандартный поток ошибок, ассоциируется с экраном
Большинство утилит Unix используют только стандартные потоки, поэтому для этих утилит можно осуществлять перенаправление.
Виды перенаправления
-
file - поток вывода перенаправляется в файл. Пример: cat file1>file2
-
file - данные из потока вывода добавляются в файл.
- <file - получение данных для стандартного ввода из файла.
-
p1 p2 - передача вывода программы р1 на ввод программы р2 (конвейер или неименованный канал). Пример: cat spisok wc l - n>file - переключение потока с номером n в файл.
- n»file - переключение потока с дескриптором n в файл, но данные добавляются в конец файла.
- n>&m - объединить потоки с дескрипторами n и m.
- «str - конструкция “Ввод здесь”. Использует стандартный поток ввода до появления строки str во вводе и потом передает его на вход программе.
В UNIX существуют программы, получающие данные из стандартного потока ввода (stdin) и выводящие результаты свое работы в стандартный поток вывода (stdout). Общее название таких программ – программы-фильтры (или просто фильтры). Фильтр обычно (но не всегда) умеет также читать данные из файлов, имена которых были переданы ему в качестве аргументов, причем в этом случае чтение из файлов происходит именно в том порядке, в каком имена файлов были указаны в качестве параметров. Совместно с возможностью перенаправления стандартных потоков (stdin, stdout и stderr), использование программ-фильтров предоставляет пользователю большие возможности по обработке информации в командной строке или скриптах.
Фильтр cat
Программа cat является классическим представителем фильтров. То, что прочитано из stdin или из файлов, выводится в stdout. Несмотря на кажущуюся простоту такого действия, использование cat позволяет пользователю быстро и эффективно решать необходимые задачи. Например, если необходимо просмотреть содержимое файла, нет нужды запускать пейджер или, тем более, редактор:
$ cat /etc/fstab
Device Mountpoint FStype Options Dump Pass#
/dev/ad0s1b none swap sw 0 0 /dev/ad0s1a / ufs rw 1 1 /dev/ad0s1e /tmp ufs rw 2 2 /dev/ad0s1f /usr ufs rw 2 2 /dev/ad0s1d /var ufs rw 2 2 /dev/acd0 /cdrom cd9660 ro,noauto 0 0
Для добавления строки в конец файла file1:
$ cat » file1 new line