Потоки ввода-вывода в Linux. Как осуществлять их перенаправление?

потоки ввода-вывода в linux. как осуществлять их перенаправление?

Для чего нужны потоки ввода-вывода

Любая программа, запускаемая в терминале Linux, имеет возможность считывать ввод с клавиатуры и показывать результат своего выполнения. Так реализуется диалог приложения и пользователя.

Ранее мы изучали запуск программ с указанием опций и параметров. Это является хорошим примером считывания ввода. Приложение способно изменять свое поведение в зависимости от входящих данных. Более того оно может останавливать выполнение и запрашивать дополнительные данные.

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

Список потоков ввода-вывода:

  • Стандартный ввод (stdin) — дает доступ к информации, вводимой пользователем с клавиатуры или любого другого устройства.
  • Стандартный вывод (stdout) — запись данных в такой поток осуществляет их показ на стандартном устройстве вывода. Как правило, это дисплей монитора, то есть окно терминала.
  • Стандартные ошибки (stderr) — операционная система должна уметь распознавать, завершилась ли программа успешно или с ошибкой. Для этого помимо стандартного вывода существует специальный поток. Запись в него сигнализирует об ошибках во время выполнения.

Заметка
Вы как пользователь консоли Linux не имеете прямого доступа к потокам ввода-вывода. Операционная система и командные интерпретаторы создают над ними уровень абстракции. Их использование будет рассмотрено в уроках о написании консольных программ на встроенном языке программирования Bash.

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

Как говорилось выше, пользователь консоли не имеете прямого доступа к потокам ввода-вывода. Однако операционная система Linux и командные интерпретаторы реализуют механизмы их перенаправления. Например, вместо вывода результата выполнения программы в терминал можно сохранить его в файл.

Рассмотрим небольшой пример, приведенный ниже. Команда ls выводит список файлов, находящихся в указанном каталоге. С помощью символа «>» мы приказываем командному интерпретатору не выводить результат в терминал, а перенаправить его в файл result.txt. Набор символов «~/», стоящий перед именем файла, сообщает операционной системе о необходимости создать его в домашней директории текущего пользователя. Если файл уже существует, он будет перезаписан.

ls /dev > ~/result.txt

В Linux есть и другие операторы перенаправления потоков ввода-вывода. Добавление числа 2 перед знаком «>» заставить обрабатывать только сообщения об ошибках, а конструкция «&>» осуществляет данное действие, как для ошибок, так и для стандартного вывода. Ниже мы приводим таблицу допустимых операторов перенаправлений.

Список операторов перенаправлений ввода-вывода

Пример команды Описание
Вызов_программы > файл Перенаправление стандартного вывода
Вызов_программы < файл Передача содержимого файла программе в качестве стандартного ввода
Вызов_программы 2> файл Перенаправление ошибок в файл
Вызов_программы &> файл Перенаправление ошибок и стандартного вывода в файл
Вызов_программы >> файл Тоже что и «>», но в случае существования файла информация дописывается в его конец
Вызов_программы &>> файл Тоже что и «>>», но в случае существования файла информация дописывается в его конец

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

find / -name .ini 2> ~/results.txt

Последние публикации