HPUNIX Сайт о ОС и не только!

Программные каналы и потоки Linux (UNIX), перенаправление потоков

10 февраля 2009 - unix

#image.jpgНеплохого времени, читатели моего блога!
В данной статье желаю систематизировать свои зания по основным принципам работы программных потоков и каналов в интерпретаторе и в общем в ОС Linux, а так же о возможностях перенаправления данных потоков.
В самом начале желаю отметить, что интерпретатор работает с 3-мя стандартными потоками:

  1. stdout это стандартный поток вывода, который обеспечивает вывод команды. Дескриптор потока равен 1.
  2. Программные каналы и потоки Linux (UNIX), перенаправление потоков
  3. stderr это стандартный поток ошибок, который выводит ошибки команд. Его дескриптор равен 2.
  4. stdin это стандартный поток ввода, который обеспечивает ввод командам. Его дескриптор равен 0.

На данный момент простыми словами опишем, что эти три пт обозначают:

stdout - стандартный поток вывода. Это, говоря обыденным языком, та информация, которую мы видим в интерпретаторе при выполнении команд. Другими словами все сообщения (без сообщений об ошибках), которые выполняемая в интерпретаторе команда докладывает и выводит на терминал (читай - экран). (вывод на экран задан по умолчанию, но можно указать и вывод, например в файл или перенаправление в другую команду, как это делается, расскажу ниже)

stderr - поток ошибок. Это ошибки при выполнении команд в bash, которые по умолчанию выводятся на stdout, другими словами на терминал (опять же, если не указан вывод в другое место)

stdin - поток ввода. Это, говоря обыденным языком - то, что мы вводим с клавиатуры в интерпретатор для выполнения команды.

Отлично данные потоки изображены на рисунке, взятом с http://rus-linux.net/:

#image.jpg

На данном изображении: Stdin, показан зеленым, имеет дескриптор 0
Stdout, показан красным, имеет дескриптор 1
Stderr, показан голубым, имеет дескриптор 2

Далее расскажу, как данные потоки можно перенаправить в/из файл. Другими словами при выполнении команды, чтобы сообщения или ошибки выводились не на экран, а записывались в файл. Для чего это нужно?

Ну например вы выполняете какую-то команду, у которой вывод не помещается в окно терминала. Вы указываете сохранять стандартный вывод в один файл, а стандартный поток ошибок в другой. Тем, все ошибки и если нужно стандартный вывод, можно будет посмотреть кропотливо, открыв сохраненные файлы.

Итак, перенаправление потоков делается следующим образом:

$ command n>file

В данной строке показано: выполнение команды command и перенаправление потока (где n = дескриптору потока) в файл file. При выполнении данного перенаправления, если конечный файл существует, он будет перезаписан.

При всем этом, если n не указан, то предполагается стандартный вывод.

$ command n>>file

Данная команда имеет аналогичный синтаксис, но тут указан символ ">>". При данном перенаправлении, если конечный файл существует, то вывод команды будет добавлен к имеющимся данным.

$ command < file

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

Временами возникает необходимость соединить стандартный поток ошибок со стандартным потоком вывода, чтобы можно было обрабатывать ошибки и обыденные результаты работы программы вместе. для этих целей употребляется композиция с символом: &. Пример выполнения данного деяния:

find / -name .name_file > /path/to/file 2>&1

При выполнении данной команды, происходит поиск файла от корня файловой системы с именованием .name_file и перенаправление результатов поиска (stdout и stderr) в файл /path/to/file.

Конструкция > /path/to/file 2>&1 перенаправляет стандартный вывод в /path/to/file и вывод ошибок в стандартный вывод.  При всем этом: написание 2>&1 перед > не будет работать, так как когда интерпретатор прочитает 2>&1, он еще не знает куда перенаправлен стандартный поток вывода, поэтому потоки ошибок и вывода не будут объединены.

$ command > file 2>&1
Программные каналы и потоки Linux (UNIX), перенаправление потоков

подобна написанию:

$ command &> file
Программные каналы и потоки Linux (UNIX), перенаправление потоков

или:

$ command 2>&file

Если необходимо проигнорировать вывод, его можно навести в устройство /dev/null, это собственного рода "черная дыра", принимающая хоть какое количество инфы и превращающая ее в ничто.

Думаю приведенной инфы о перенаправлении потоко будет достаточно для понимания сути, на данный момент расскажу о конвеерной передаче.

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

$ command1 | command2

В данном примере делается команда command1, ее поток вывода употребляется,  как поток ввода при выполнении command2 .

На сегодня все. Буду рад комментариям и дополнениям. Спасибо.

Похожие статьи

Теги: ос linux, ос
Рейтинг: +1 Голосов: 128 1120 просмотров
Комментарии (0)

Нет комментариев. Ваш будет первым!

Найти на сайте: параметры поиска

Windows 7

Среда Windows 7 на первых порах кажется весьма непривычной для многих.

Windows 8

Если резюмировать все выступления Microsoft на конференции Build 2013.

Windows XP

Если Windows не может корректно завершить работу, в большинстве случаев это

Windows Vista

Если к вашему компьютеру подключено сразу несколько мониторов, и вы регулярно...