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

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

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; просмотров: 1024;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.014 сек.