Работа с потоками STDIN, STDOUT, STDERR

Виды потоков

В системах Linux и Unix существуют стандартные входной (STDIN) и выходные (STDOUT, STDERR) потоки (каналы). Далее рассмотрим подробнее каждый из них.

  • STDIN (Номер файлового дескриптора - 0)
    Стандартный входной поток. Канал принимающий данные для обработки и последующей передачи на канал STDOUT и/или STDERR.
  • STDOUT (Номер файлового дескриптора - 1)
    Стандартный выходной поток. Представляет собой канал записи результатов выполнения каких-либо процессов.
  • STDERR (Номер файлового дескриптора - 2)
    Стандартный выходной поток ошибок. В данный канал попадают сообщения об ошибках.

В рамках терминала канал STDIN считывает входные данные, а каналы STDOUT и STDERR выводят выходные данные на экран.

Управление потоками

Для перенаправления каналов в терминале, применяют определенные символы. Рассмотрим каждый из них на примере команды поиска системных файлов, которые содержат слово - core. Все найденные файлы будут формироваться в поток STDOUT. Те найденные файлы, к которым у обычного пользователя нет доступа будут попадать в STDERR.

  • > - вывод STDOUT в файл.

find / -name core > /tmp/testfile

В файл /tmp/testfile попадет список путей ко всем найденным файлам, а список ошибок отобразится в терминале.

Запись в файл
Запись STDOUT в файл

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

  • >> - вывод STDOUT в конец файла.

find / -name core >> /tmp/testfile

В конец файла /tmp/testfile попадет список путей ко всем найденным файлам, а список ошибок отобразится в терминале.

Запись STDOUT в конец файла
Запись STDOUT в конец файла
  • >& - вывод STDOUT и STDERR в файл

find / -name core >& /tmp/testfile

С помощью составного символа - >& мы объединяем стандартный выходной поток с выходным потоком ошибок. В файл /tmp/testfile попадет список путей ко всем найденным файлам и список ошибок.

Объединение выходных потоков
Объединение выходных потоков
  • 2> - вывод STDERR в файл

find / -name core 2> /tmp/testfile

В файл /tmp/testfile попадет список ошибок, а список найденных файлов, будет выведен в терминале.

Вывод STDERR
Вывод STDERR

Вывод потоков можно комбинировать и распределять по разным местам. Например, выведем список найденных файлов в /tmp/testfile, а список ошибок отбросим, перенаправив их в /dev/null.

find / -name core > /tmp/testfile 2> /dev/null

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

Для того чтобы направить выходной поток одной команды на входной поток другой, применяют символ - | (pipe).

Для примера, выведем в консоли отдельные процессы системы с именем - chrome.

ps | grep chrome

Здесь результат выполнения команды ps передается в роли входных данных для команды grep, в которых она ищет совпадения с именем chrome.

Заключение

В этой небольшой статье мы рассмотрели все стандартные входные и выходные и потоки, которые, в свою очередь, очень часто применяются системными администраторами на практике.