Файл стандартного потока ошибок (stderr) имеет дескриптор 2. В этот файл записываются сообщения об ошибках, возникающих в ходе выполнения команды. По умолчанию сообщения об ошибках выводятся на экран терминала (устройство /dev/tty), но их также можно перенаправить в файл. Зачем же для регистрации ошибок выделять специальный файл? Дело в том, что это очень удобный способ выделения из результатов работы команды собственно выходных данных, а также хорошая возможность эффективно организовать ведение различного рода журнальных файлов.
5.7. Файловый ввод–вывод
При вызове команд можно указывать, откуда следует принимать входные данные и куда необходимо направлять выходные данные, а также сообщения об ошибках. По умолчанию, если не указано иное, подразумевается работа с терминалом: данные вводятся с клавиатуры и выводятся на экран. Но интерпретатор shell располагает механизмом переадресации, позволяющим ассоциировать стандартные потоки с различными файлами. В табл. 5.1 приведены наиболее распространенные операторы переадресации.
Во время перенаправления стандартного потока ошибок следует указывать дескриптор файла (2). Для потоков ввода и вывода делать это не обязательно.
Таблица 5.1. Основные операторы переадресации
команда > файл
Направляет стандартный поток вывода в новый файл
команда 1> файл
Направляет стандартный поток вывода в указанный файл
команда >> файл
Направляет стандартный поток вывода в указанный файл (режим присоединения)
команда > файл 2>&1
Направляет стандартные потоки вывода и ошибок в указанный файл
команда 2> файл
Направляет стандартный поток ошибок в указанный файл
команда 2» файл
Направляет стандартный поток ошибок в указанный файл (режим присоединения)
команда >> файл 2>&1
Направляет стандартные потоки вывода и ошибок в указанный файл (режим присоединения)
команда < файл1 > файл2
Получает входные данные из первого файла и направляет выходные данные во второй файл
команда < файл
В качестве стандартного входного потока получает данные из указанного файла
команда << разделитель
Получает данные из стандартного потока ввода до тех пор, пока не встретится разделитель
команда <&m
В качестве стандартного входного потока получает данные из файла с дескриптором m
команда > &m
Направляет стандартный поток вывода в файл с дескриптором m
Рассмотрим, как осуществляется переадресация стандартного потока вывода. В следующей командной строке из файла /etc/passwd извлекаются имена пользователей, известных в системе, полученный список сортируется по алфавиту, а результаты направляются в файл sort.out.
$ cat /etc/passwd | awk -F: '{print $1}' | sort > sort.out
Опция -f программы awk свидетельствует о том, что указанный после нее символ двоеточия является разделителем полей в файле /etc/passwd.
В один и тот же файл в режиме присоединения можно направлять результаты работы сразу нескольких команд:
$ ls -l | grep ^d >> files.out
$ 1s account* >> files.out
В первой строке в файл files.out помещается список каталогов, а во второй -cписок файлов, имена которых начинаются со строки "account".
Для создания пустого файла нулевой длины выполните следующую команду:
$ > myfile
Рассмотрим несколько примеров переадресации стандартного потока ввода. Чтобы из командной строки отправить пользователю электронное сообщение, которое находится в файле, следует направить файл программе mail. Посредством следующей команды пользователь louise получит сообщение, которое содержится в файле contents.txt.
$ mail louise < contents.txt
Переадресация вида команда << разделитель называется конструкцией "документ здесь". Более подробно мы поговорим о ней позже. Пока же рассмотрим общие принципы ее функционирования. Встречая в командной строке оператор «, интерпретатор shell воспринимает все данные, вводимые с клавиатуры, как входной поток, пока в отдельной строке не будет введено слово–разделитель, указанное в командной строке после оператора. Разделителем может служить любое слово. Вот как, например, можно создать файл в режиме командной строки:
$ cat >> myfile << Пока
> Привет! Я работая за терминалом $TERM
и мое имя $LOGNAME.
Пока!
Пока
$ cat myfile
Привет! Я работаю за терминалом vt100
и мое имя dave.
Пока!
Признаком окончания ввода является слово "Пока" в отдельной строке, за которым нет никаких других символов. Вот почему предпоследняя строка не послужила командой окончания: после слова "Пока" стоит восклицательный знак.
При переадресации стандартного потока ошибок указывается дескриптор 2. Рассмотрим пример. Утилита grep ищет в файле missiles строку "trident":
$ grep "trident" missiles
grep: missiles: No such file or directory