Перенаправление потоков ввода/вывода
При открытии файла его имя ассоциируется с так называемым файловым де- скриптором — целым числом, которым затем оперируют все остальные про- цедуры чтения или записи. Со всяким процессом при его создании автомати- чески связываются три потока:
r стандартный поток ввода (stdin), файловый дескриптор которого — 0;
r стандартный поток вывода (stdout), файловый дескриптор — 1;
r стандартный поток вывода ошибок (stderr), файловый дескриптор — 2.
Стандартные потоки не надо специально открывать в программах, т. к. они автоматически ассоциируются с процессом при его создании.
Поток ввода открыт на чтение, а потоки вывода и ошибок — на запись. Обычно по умолчанию стандартный поток ввода связан с клавиатурой, а стандартные потоки вывода и ошибок — с дисплеем.
Оболочка Bash позволяет перенаправить стандартные потоки, для чего ис- пользуются следующие операторы:
r < — оператор перенаправления стандартного потока ввода;
r > или 1> — операторы перенаправления стандартного потока вывода;
r 2> — оператор перенаправления стандартного потока вывода ошибок.
Например, перенаправив стандартный поток ввода команды mail, можно отпра- вить электронное письмо с текстом, содержащимся в файле letter (пример 8.1).
Пример 8.1. Перенаправление потока ввода |
$ mail -s 'Privet!' user1 < letter
Команда mail (пример 8.1) отправит электронное письмо пользователю user1. Тема письма (Subject) указана после опции -s, а текст письма передан через стандартный поток ввода команде mail из файла letter.
Следующая команда перенаправит поток вывода в файл ls.txt (пример 8.2).
Пример 8.2. Перенаправление потока вывода |
$ ls > ls.txt
В файле ls.txt окажется список файлов из текущего каталога, выведенный командой ls в стандартный поток вывода.
Аналогично в файл можно перенаправить поток ошибок (пример 8.3).
Пример 8.3. Перенаправление потока ошибок |
$ ls -ld /etc /ctc 2> ls.err
drwxr-xr-x 87 root root 6064 Dec 15 18:57 /etc
$ cat ls.err
ls: /ctc: No such file or directory
В примере 8.3 поток вывода ошибок был перенаправлен в файл ls.err. В каче- стве аргументов команды ls -ld были заданы каталог /etc и несуществую- щий каталог /ctc. Информация о каталоге /etc была выведена в стандартный поток вывода (на экран), а о /ctc — в стандартный поток вывода ошибок, ко- торый был перенаправлен в файл ls.err. Содержимое файла ls.err было выве- дено с помощью команды cat.
Модифицируем предыдущую команду так, чтобы поток вывода был перена- правлен в файл ls.txt одновременно с перенаправлением потока ошибок в ls.err (пример 8.4).
Пример 8.4. Перенаправление потока вывода и потока вывода ошибок |
$ ls -ld /etc /ctc > ls.txt 2> ls.err
Если же необходимо использовать один и тот же файл ls.txt для записи пото- ка вывода и потока ошибок, то следует применить оператор сцепления пото- ков & (пример 8.5).
Пример 8.5. Сцепление потоков вывода и вывода ошибок |
$ ls -ld /etc /ctc > ls.txt 2>&1
Оболочка Bash позволяет сделать это еще проще (пример 8.6).
Пример 8.6. Сцепление потоков в Bash |
$ ls -ld /etc /ctc &> ls.txt
Следует особо подчеркнуть, что операции перенаправления потоков вывода и вывода ошибок в файл стирают его содержимое, записывая новое содер- жимое взамен старого. Этим можно пользоваться для стирания содержимого файлов и создания новых пустых файлов. Так, например, для стирания со- держимого файла ls.txt можно использовать команду перенаправления (при- мер 8.7).
Пример 8.7. Очистка содержимого файла с помощью перенаправления |
$ > ls.txt
Эффект замещения старого содержимого файлов, возникающий при пере- направлении в них потоков вывода и ошибок, часто бывает нежелателен. Оболочка Bash позволяет исключить стирание содержимого файлов при перенаправлении в них потоков вывода или ошибок с помощью команды set –o noclobber.
Однако все же есть способ даже при установленной опции noclobber пере- писать содержимое существующего файла с помощью операции перенаправ- ления вывода или вывода ошибок. Для этого можно воспользоваться опера- торами:
r >| — перенаправление потока вывода с гарантированной перезаписью файла;
r 2>| — перенаправление потока ошибок с гарантированной перезаписью файла.
Пример 8.8. Гарантированная перезапись файла |
$ set –o noclobber
$ ls -l > ls.txt
bash: ls.txt cannot overwrite existing file
$ ls –l >| ls.txt
Последняя команда примера запишет подробную информацию о содержимом текущего каталога в существующий файл ls.txt, не обращая внимания на то, что файл уже существует и установлена опция оболочки noclobber.
Сбросить опцию noclobber можно с помощью команды set +o noclobber.
Можно дописать в существующий файл информацию из потока вывода вме- сто перезаписи файла. Для этого оболочка предоставляет операторы:
r >> — для перенаправления потока вывода на добавление к файлу;
r 2>> — для перенаправления потока вывода ошибок на добавление к файлу.
Многие команды, работающие с текстом, позволяют использовать поток вво- да вместо открытия на чтение файла. Для завершения ввода с клавиатуры следует нажать комбинацию клавиш <Ctrl>+<D> для передачи в поток ввода символа окончания потока. После этого команда, читающая стандартный по- ток ввода, завершит свою работу (пример 8.9).
Пример 8.9. Передача данных через поток ввода с клавиатуры |
$ cat > f1 Privet
<Ctrl>+<D>
$ cat f1 Privet
В примере 8.9 команда cat > f1 получила через стандартный ввод текст Privet с клавиатуры, который был записан через стандартный поток вывода в файл f1.
В сценариях оболочки часто возникает необходимость передать блок текста, находящийся непосредственно в тексте сценария, какой-либо команде этого же сценария. В таких случаях используют конструкцию here document (доку- мент здесь) — << (два знака "меньше"). В таком случае для окончания ввода используется любой удобный символ вместо символа конца файла. Этот сим- вол должен быть указан после << и должен быть единственным символом
в строке. Так, в примере 8.10 пользователю user1 послано письмо. Тело письма передается через поток ввода команды mail с помощью here document. В каче- стве символа окончания потока ввода установлена точка.
Пример 8.10. Конструкция here document |
$ mail -s HereDoc user1 << . Some Text here!
.
Дата добавления: 2015-06-12; просмотров: 1030;