Лекция: Перенаправление ввода и вывода и конвейеризация
Каждая запущенная из командного интерпретатора программа получает три открытых потока ввода/вывода: стандартный ввод (дескриптор 0); стандартный вывод (1); стандартный вывод сообщений об ошибках (2). По умолчанию все эти потоки ассоциированы с терминалом, т.е. программа, использующая только эти потоки, ожидает ввод с клавиатуры, а весь вывод осуществляется на экран монитора. Интерпретатор позволяет пользователю перенаправить потоки ввода/вывода, установив ввод из файла, а вывод в файл.
Все преимущества возможности перенаправления ввода/вывода становятся ясны при использовании еще одного мощного инструмента UNIX – конвейеров (программных каналов). Конвейером называется использование стандартного вывода одной команды в качестве стандартного ввода другой. Синтаксис перенаправления ввода/вывода:
команда >file перенаправление стандартного потока вывода в файл file
команда>>fileдобавление (дозапись) в файл file данных из стандартного потока вывода
<file получение стандартного потока ввода из файла file
p1|p2 передача стандартного потока вывода программы р1 в потов ввода p2
n>file переключение потока вывода из файла с дескриптором n в file
n>>file то же, но записи добавляются в file
n>&m слияние потоков с дескрипторами n и m
Пример:
sort textfile | lp
содержимое файла textfile сортируется командой sort, а затем этот файл (выход команды sort) передается на печать.
cat *.994 ¦ grep profits | lp
в текущем каталоге производится поиск файлов, имена которых заканчиваются на994(шаблон *.994); список таких файлов отправляется на ввод командыgrep, которая произведет поиск в этих файлах слова profits; затем строки, содержащие это слово, будут напечатаны.
my_prog 2>/dev/null
при запуске программы my_prog вывод ошибок (стандартный поток с дескриптором 2) перенаправляется в нулевое устройство /dev/null, т.е. подавляется.
my_prog >/dev/null 2>&1
сначала будет осуществлено слияние потоков 2 и 1 (оба будут указывать на терминал пользователя), а потом стандартный поток вывода будет перенаправлен в файл /dev/null