русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Перенаправление потоков ввода/вывода


Дата добавления: 2015-07-09; просмотров: 838; Нарушение авторских прав


При открытии файла его имя ассоциируется с так называемым файловым де- скриптором — целым числом, которым затем оперируют все остальные про- цедуры чтения или записи. Со всяким процессом при его создании автомати- чески связываются три потока:

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!

.



<== предыдущая лекция | следующая лекция ==>
Команды режима двоеточия | Конвейеры и фильтры


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.004 сек.