Добавить в корзинуПозвонить
Найти в Дзене
student.tut

Каналы и направления потоков в Linux

Каждому процессу доступны по меньшей мере три информационных канала: “стандартный ввод” (STDIN), “стандартный вывод” (STDOUT) и “стандартная ошибка” (STDERR). Эти каналы устанавливаются ядром системы “от имени процесса”, и поэтому сам процесс не обязательно знает их направленность. Они, например, могут быть связаны с окном терминала, файлом, подключением к сети или с каналом, принадлежащим к другому процессу. Большинство команд принимает входные данные из канала STDIN. Выходная информация записывается ими в канал STDOUT, а сообщения об ошибках — в канал STDERR. Это соглашение позволяет объединять команды подобно строительным блокам для организации конвейерной обработки данных. Командная оболочка интерпретирует символы “<”, “>” и “>>” как инструкции по
изменению направления передаваемых командой данных в файл или принимаемых данных из файла. Для перенаправления вывода команды используется символ (>). Если файла нет, значит создается новый. Если уже существует, содержащаяся в ней информ

Каждому процессу доступны по меньшей мере три информационных канала: “стандартный ввод” (STDIN), “стандартный вывод” (STDOUT) и “стандартная ошибка” (STDERR). Эти каналы устанавливаются ядром системы “от имени процесса”, и поэтому сам процесс не обязательно знает их направленность. Они, например, могут быть связаны с окном терминала, файлом, подключением к сети или с каналом, принадлежащим к другому процессу.

Большинство команд принимает входные данные из канала STDIN. Выходная информация записывается ими в канал STDOUT, а сообщения об ошибках — в канал STDERR. Это соглашение позволяет объединять команды подобно строительным блокам для организации конвейерной обработки данных.

Командная оболочка интерпретирует символы “<”, “>” и “>>” как инструкции по
изменению направления передаваемых командой данных в файл или принимаемых данных из файла.

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

Дату и время добавим в файл date.log. Затем выведем (cat) этот файл тогда и только тогда (&&), когда выполнится предыдущее действие.
Дату и время добавим в файл date.log. Затем выведем (cat) этот файл тогда и только тогда (&&), когда выполнится предыдущее действие.

Для того чтобы перенаправить потоки STDOUT и STDERR в одно и то же место, используйте символ “>&”. Для того чтобы перенаправить только поток STDERR, используйте вариант “2>”.

На примере команды find можно показать, почему важно обрабатывать потоки
STDOUT и STDERR отдельно. Дело в том, что она формирует выходные данные по обоим каналам, особенно в случае ее выполнения непривилегированным пользователем. Например, при выполнении команды
$ find / -name core

core - файла дампа памяти процесса
core - файла дампа памяти процесса

Обычно генерируется так много сообщений об ошибках “permission denied” (отсутствие прав доступа), что настоящие результаты поиска теряются в “шуме”. Чтобы отбросить все сообщения об ошибках, можно использовать такой вариант.
$ find / -name core 2> /dev/null

В файле core теперь содержаться данные без ошибок
В файле core теперь содержаться данные без ошибок

Для того чтобы связать канал STDOUT одной команды с каналом STDIN другой, используйте символ " | ".

$ ls -l | less

Less - это команда Linux, используемая для фильтрации и просмотра текстовых файлов по одной странице экрана за раз.

Вертикальная черта (|) между командами — это символ канала в Linux. Он
соединяет стандартный вывод первой команды со стандартным вводом следующей. Командная строка, содержащая каналы, называется конвейером (pipeline).

Программа, команда и комбинированная команда
Программа, команда и комбинированная команда

символ “||” обеспечит выполнение следующей команды только в том случае, если предыдущая команда не выполнится (т.е. сгенерирует ненулевое значение кода завершения).

Сообщение о невыполнении предыдущей команды
Сообщение о невыполнении предыдущей команды

Для того чтобы разбить команду на несколько строк, для наглядности отделяя тем самым код обработки ошибок от остальной части командного конвейера, можно использовать в сценариях обратную косую черту.
$ ср --preserve --recursive /etc/* /spare/backup \
|| echo "Did NOT make backup"

Для получения обратного эффекта, т.е. объединения нескольких команд в одной
строке, можно использовать в качестве разделителя точку с запятой (;).

Литература

Unix и Linux: руководство системного администратора 4-е издание. Эви Немет, Гарт Снайдер, Трент Хейн, Бэн Уэйли

Linux. Командная строка. Лучшие практики. Барретт Дэниел Джей