Шрифт:
Опция -f программы awk свидетельствует о том, что указанный после нее символ двоеточия является разделителем полей в файле /etc/passwd.
В один и тот же файл в режиме присоединения можно направлять результаты работы сразу нескольких команд:
$ ls -l | grep ^d >> files.out
$ 1s account* >> files.out
В первой строке в файл files.out помещается список каталогов, а во второй -cписок файлов, имена которых начинаются со строки "account".
Для создания пустого файла нулевой длины выполните следующую команду:
$ > myfile
5.7.2. Переадресация стандартного потока ввода
Рассмотрим несколько примеров переадресации стандартного потока ввода. Чтобы из командной строки отправить пользователю электронное сообщение, которое находится в файле, следует направить файл программе mail. Посредством следующей команды пользователь louise получит сообщение, которое содержится в файле contents.txt.
$ mail louise < contents.txt
Переадресация вида команда << разделитель называется конструкцией "документ здесь". Более подробно мы поговорим о ней позже. Пока же рассмотрим общие принципы ее функционирования. Встречая в командной строке оператор «, интерпретатор shell воспринимает все данные, вводимые с клавиатуры, как входной поток, пока в отдельной строке не будет введено слово–разделитель, указанное в командной строке после оператора. Разделителем может служить любое слово. Вот как, например, можно создать файл в режиме командной строки:
$ cat >> myfile << Пока
> Привет! Я работая за терминалом $TERM
и мое имя $LOGNAME.
Пока!
Пока
$ cat myfile
Привет! Я работаю за терминалом vt100
и мое имя dave.
Пока!
Признаком окончания ввода является слово "Пока" в отдельной строке, за которым нет никаких других символов. Вот почему предпоследняя строка не послужила командой окончания: после слова "Пока" стоит восклицательный знак.
5.7.3. Переадресация стандартного потока ошибок
При переадресации стандартного потока ошибок указывается дескриптор 2. Рассмотрим пример. Утилита grep ищет в файле missiles строку "trident":
$ grep "trident" missiles
grep: missiles: No such file or directory
Однако в текущем каталоге нет такого файла, и соответствующее сообщение об ошибке по умолчанию выводится на экран. Можно переслать все сообщения об ошибках в системную корзину (устройство /dev/null):
$ grep "trident" missiles 2> /dev/null
Теперь никакие сообщения на экране отображаться не будут.
Подобный режим работы не всегда желателен. Часто сообщения об ошибках необходимо фиксировать в файле для последующего анализа. В следующей командной строке сообщения об ошибках пересылаются в файл grep.err.
$ grep "trident" missiles 2> grep.err
$ cat grep.err
grep: missiles: No such file or directory
Во многих случаях создается общий журнальный файл, в который добавляются сообщения об ошибках, поступающие от многих команд. При этом следует использовать оператор >>, чтобы не перезаписывать файл:
$ grep "LPSO" * 2>> account.err
$ grep "SILO" * 2>> account.err
5.7.4. Переадресация обоих выходных потоков
В одной командной строке можно последовательно переадресовывать как стандартный поток вывода, так и стандартный поток ошибок. Ниже приведен пример, в котором команда cat обрабатывает два файла, направляя вывод в файл accounts.out, а сообщения об ошибках — в файл accounts.err.
$ cat account_qtr.doc account_end.doc 1> accounts.out 2> accounts.err
$ cat accounts.out
AVBD 34HJ OUT AVFJ 31KO OUT
$ cat accounts.err
cat: account_end.doc: No such file or directory
Просмотрев файл accounts.err, обнаруживаем, что исходного файла account_end.doc не существует.
5.7.5. Объединение выходных потоков в файле
Оператор n>&m позволяет перенаправить файл с дескриптором n туда, куда направлен файл с дескриптором m. Подобных операторов в командной строке может быть несколько, в этом случае они вычисляются слева направо. Рассмотрим пример: