Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
25
Добавлен:
05.06.2015
Размер:
23.43 Кб
Скачать

26. Использование программных каналов. Понятия стандартного ввода и стандартного вывода.

Могут возникнуть ситуации, когда нужно передать данные из одной команды в другую, т.е. необходимо направить стандартный вывод одной команды на стандартный ввод другой, а не в файл. В этом случае выполнение каждой последующей команды зависит от выполнения предыдущей. Число таких передач ограничено только размерами командной строки. Для такого соединения в ОС Linux предусмотрен программный канал. Программный канал | (pipe, символ вертикальной черты) помещается между двумя командами и связывает стандартный поток вывода первой команды со стандартным потоком ввода второй команды. Выходная информация команды, стоящей перед оператором канала, передается в качестве входной в команду, стоящую за оператором канала.

В следующем примере передадим по каналу стандартный вывод расширенного выполнения команды ls с опциями –la (опция –l расширенный вывод сведений об объекте, -a – отображение скрытых (точечных) файлов) для папки /home/antonk на вход команды head (команда читает сверху вниз первые n строк) для отображения пяти первых строк, а затем средствами перенаправления запишем полученную информацию в новый файл «yyyy».

[antonk@lab4236s ~]$ ls -la /home/antonk | head -5 > yyyy

[antonk@lab4236s ~]$ cat yyyy

total 1713212

-rw-rw-r– 1 antonk antonk 109 Sep 22 13:45 !

drwx------27 antonk antonk 4096 Sep 22 14:22 .

drwxr-xr-x 34 root root 4096 Sep 18 09:23 ..

-rw------- 1 antonk antonk 491 Sep 18 09:29 .ICEauthority

[antonk@lab4236s ~]$

Программные каналы эффективно применяют также для сортировки и фильтрации данных. Например, с помощью команды отображения системных процессов ps выведем последние четыре процесса, принадлежащих пользователю antonk и отсортируем их по мере убывания номера процесса UID. Для вывода системных процессов применяется команда ps с опциями –ef. Более подробно об этой команде поговорим в разделе «Системные процессы».

[antonk@lab4236s ~]S ps -ef | grep antonk | tail -4 | sort -nr -k 2

antonk 18889 14588 0 14:34 pts/2 00:00:00 sort -nr -k 2

antonk 18888 14588 0 14:34 pts/2 00:00:00 tail -4

antonk 18887 14588 0 14:34 pts/2 00:00:00 grep antonk

antonk 18886 14588 0 14:34 pts/2 00:00:00 ps -ef

[antonk@lab4236s ~]$

Прокомментируем приведенную команду. Фильтр grep с параметром antonk позволяет отобразить только те строки, которые содержат слово antonk, т.е. относятся к пользователю antonk. Далее по программному каналу с помощью команды tail с опцией -4 выделяются только последние четыре процесса и затем производится численная (опция -n) в обратном порядке (опция –r) по второй колонке (-k 2), т.е. по номеру процесса (PID) сортировка.

Кроме того, с помощью программного канала можно совмещать процедуры поиска файлов и отображения отдельных строк, удовлетворяющих определенному правилу:

[antonk@lab4236s ~]$ find ~ -name 'r*' -type f

/home/antonk/222/lab9/tt/rr

/home/antonk/.gstreamer-0.10/registry.x86_64.xml

/home/antonk/.gstreamer-0.8/registry-x86_64.xml /home/antonk/rrr

[antonk@lab4236s ~]$ find ~ -name 'r*' -type f | grep -v 64

/home/antonk/222/lab9/tt/rr /home/antonk/rrr

[antonk@lab4236s ~]$

В примере с помощью команды find (более подробно возможности команды find см. в главе 3), начиная с домашней директории пользователя antonk, отображены только файлы, имена которых начинаются с буквы «r» и далее имеют произвольное количество символов. Затем с помощью программного канала данный поток отправляется на фильтр grep (опция -v – инверсия регулярного выражения), с помощью которого отфильтровываются строки, не имеющие цифр 64.

С помощью программного канала можно пересылать из одной команды в другую не только перечень, выводимый командой ls, но также любую информацию, например содержимое целого файла. В следующем при­мере с помощью команды cat читается и выводится содержимое файла «yyyy», которое затем посылается по каналу в команду lpr (печать содержимого файла).

[antonk@lab4236s ~]$ cat yyyy | lpr

[antonk@lab4236s ~]$

Стандартные потоки данных

Иногда требуется не только вывести информацию на экран, но также поместить ее файл для дальнейшей сортировки или для демонстрации этих данных другим разработчикам СБИС. Такое действие можно организовать путем функций перенаправления. Полный перечень символов перенаправления указан в табл.2.

В операционной системе существует разделение между физическим файлом и его логической организацией. Вообще, по определению файл – поименованная область на диске. Логическая организация файлов определяет способ выполнения операций ввода и вывода. Данные, обрабатываемые в операциях ввода и вывода, организованы в виде файлов. Данные, вводимые с клавиатуры или выводимые на экран при работе команд Linux, направляются в поток данных, организован­ный как непрерывная совокупность байтов.

Входной поток данных в ОС Linux называется стандартным вводом, а выходной поток данных – стандартным выводом.

Существует также отдельный выходной поток данных, зарезервированный исключительно для сообщений об ошибках, называемый стандартным выводом сообщений об ошибках.

Поскольку стандартный ввод и стандартный вывод имеют такую же организацию, как файлы, они могут свободно взаимодействовать с файлами. В ОС Linux широко используются средства перенаправления, которые позволяют перемещать данные в файлы и из файлов. Можно, например, перенаправить стандартный вывод так, чтобы ин­формация не отображалась на экране, а записывалась в файл.

Символы перенаправления командного интерпретатора

Символы перенаправления

Назначение

>

Перенаправляет стандартный вывод в файл или на устройство. При этом, если файл не существует, он создается, если же файл существует, он перезаписывается

>!

Восклицательный знак приводит к перезаписи файла, если он существует. Этот символ отменяет действие опции, которая запрещает пе­резапись существующих файлов

<

Перенаправляет стандартный ввод из файла или устройства в программу

> >

Перенаправляет стандартный вывод в файл или на устройство, добавляя выводимые данные к концу файла

2 >

Перенаправляет стандартный вывод сообщений об ошибках в файл или на устройство

2>>

Перенаправляет и добавляет стандартный вывод сообщений об ошибках в файл или на устройство

2>&1

Перенаправляет стандартный вывод сообщений об ошибках на стандартный ввод

>&

Перенаправляет стандартный вывод сообщений об ошибках в файл или на устройство

|&

Перенаправляет по каналу стандартный вывод сообщений об ошибках на вход другой команды

В следующем примере показано, как информация сначала отображается на экране, затем записывается в новый файл «www», находящийся в домашнем каталоге пользователя antonk, а далее содержимое данного файла выводится с помощью фильтра cat:

[antonk@lab4236s ~]$ ls -ld /etc/u*

drwxr-xr-x 4 root root 4096 Feb 13 2008 /etc/udev

-rw-r–r– 1 root root 127 Nov 26 2006 /etc/updatedb.conf

drwxr-xr-x 3 root root 4096 Feb 13 2008 /etc/uucp

[antonk@lab4236s ~]$ ls –ld /etc/u* > -/www

[antonk@lab4236s ~]$ cat -/www

drwxr-xr-x 4 root root 4096 Feb 13 2008 /etc/udev

-rw-r–r– 1 root root 127 Nov 26 2006 /etc/updatedb.conf

drwxr-xr-x 3 root root 4096 Feb 13 2008 /etc/uucp

[antonk@lab4236s ~]S

Можно также перенаправить стандартный ввод с клавиатуры в файл, чтобы входная информация читалась из файла, а не с клавиатуры. По умолчанию большинство команд направляют стандартный поток вывода на экран. В следующем примере с помощью комбинации средств перенаправления стандартного ввода и стандартного вывода информация из файла «bmt?» копируется в новый файл «1111»:

[antonk@lab4236s~]$ cat bmt\?

sdfsdf

sdfsdf

[antonk@lab4236s ~]$ cat < bmt\? > 1111

[antonk@lab4236s ~]$ cat 1111

sdfsdf

sdfsdf

[antonk@lab4236s ~]$

Команда cat посылает свою выходную информацию на стандартный вывод. Содержимое файла копируется на стандартный вывод, пунктом назначения которого является экран, где отображается содержимое файла. Если же в качестве назначения стандартного потока вывода указать файл, то информация не будет отображена на экране, а поместится в файл.

В следующем примере показаны: сокращенный вывод сведений о файлах, находящихся в текущей директории, с помощью команды ls, затем расширенный вывод сведений с использованием опции –l, далее перенаправление стандартного потока вывода в файл «list». Наконец, в конце этого примера с помощью команды cat осуществляется просмотр нового файла «list» со сведениями о файлах, находящихся в текущей директории.

[antonk@lab4236sl temp]S ls

a.c b.c c.c d.c

[antonk@lab4236sl temp]S ls -l

total 16

-rw-rw-r– 1 antonk antonk 0 Oct 31 19:19 a.c

-rw-rw-r– 1 antonk antonk 0 Oct 31 19:19 b.c

-rw-rw-r– 1 antonk antonk 0 Oct 31 19:19 c.c

-rw-rw-r– 1 antonk antonk 0 Oct 31 19:19 d.c

[antonk@lab4236sl temp]S ls > list

[antonk@lab4236sl temp]S cat list

b.c

d.c

list

[antonk@lab4236sl temp]

Если пользователь попытается использовать один и тот же файл для входного потока команды и перенаправленного потока назначения, возникнет ошибка. Так как операция перенаправления выполняется первой, входной файл, поскольку он существует, унич­тожается и заменяется файлом с тем же именем. Когда команда начинает выполняться, она обнаруживает пустой входной файл.

Соседние файлы в папке KTNI_Козлов(ответы)