Найти в Дзене

Ввод/вывод в Linux и их перенаправление

Оглавление

Давненько у нас не было материалов для новичков в системном администрировании и желающих получше узнать подноготную Linux-дистрибутивов. Исправляюсь и далее расскажу про перенаправление ввода/вывода в Linux, стараясь сделать это просто и понятно.

Если вы подписаны на канал, но еще не приняли участие в конкурсе, то нужно это исправлять как можно быстрее! Если вы еще не подписаны на Просто Код, то быстренько подписываетесь и переходите по ссылке ниже, чтобы узнать подробности розыгрыша и описание призов.

Ввод, вывод и потоки

Не будем углубляться сильно в теорию (для этого есть учебники и справочники), а просто примем за данность следующие моменты:

  • ввод - данные, которые поступают от пользователя в систему при помощи клавиатуры.
  • вывод - данные, которые поступают от системы пользователю при помощи терминала и монитора.

Кажется, что все пока просто, верно? Ввод и вывод распределяются между тремя стандартными потоками: stdin (standard input или стандартный ввод), stdout (standard output или стандартный вывод) и stderr (standard error или стандартная ошибка). Также каждый поток пронумерован: 0 (stdin), 1 (stdout) и 2 (stderr). Стандартный вывод используется командами только для считывания данных, остальные две (1 и 2) можно использовать только для их записи.

Наглядная схема, показывающая потоки ввода, вывода и ошибки
Наглядная схема, показывающая потоки ввода, вывода и ошибки

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

Демонстрация работы стандартного потока ввода посредством команды cat
Демонстрация работы стандартного потока ввода посредством команды cat

Для демонстрации работы потока вывода воспользуемся командой echo, знакомой нам по некоторым предыдущим заметкам.

Работа стандартного потока вывода через команду echo
Работа стандартного потока вывода через команду echo

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

Пример потока стандартной ошибки
Пример потока стандартной ошибки

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

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

  • > - перенаправление стандартного вывода
  • < - перенаправление стандартного ввода
  • 2> - перенаправление стандартной ошибки

Вернемся к командам, которые использовали выше и дополним их командами перенаправления.

cat > text1

cat < text1

ls % 2> error

Перенаправление ввода, вывода и ошибки
Перенаправление ввода, вывода и ошибки

Как понять происходящее на демонстрации? Сначала мы перенаправили стандартный вывод посредством команды cat в файл text1. Затем перенаправили содержимое файла text1 и вывели его на экран (хотя знак перенаправления можно было и не использовать, так как cat сама понимает, что от нее хотят, я оставил его исключительно для примера). Ну, и наконец, мы перенаправили стандартный вывод ошибки в файл error, который после просмотрели при помощи команды cat.

Использование одинарных знаков приводит к перезаписи файла. Чтобы этого не делать, а присоединять данные к нему нужно использовать двойные символы:

  • >> - перенаправление стандартного вывода
  • << - перенаправление стандартного ввода
  • 2>> - перенаправление стандартной ошибки
Использование двойных символов для присоединения данных при перенаправлении
Использование двойных символов для присоединения данных при перенаправлении

Вы можете подписаться на обновления канала Просто Код в Телеграме и получать уведомления о выходе новых заметок прямо в любимый мессенджер!

Каналы и их операторы

Чтобы перенаправлять потоки между программами в Linux используются каналы. Когда пользователь выполняет какую-то команду, то вывод данных (мы его еще называем «выхлоп») можно перенаправить в другую программу через канал, без его отображения на экране. Вторая программа обработает поступившие данные и посредством своего стандартного потока выведет отфильтрованные данные. Чтобы установить связь между потоками программ нужно использовать символ | (pipe или труба).

ls | less

Пример перенаправления потока между двумя командами
Пример перенаправления потока между двумя командами

В данном примере мы данные, полученные от команды ls (list, просмотр содержимого каталога), перенаправили посредством канала в команду less, которая разместила полученные данные с новой строки и вывела на экран. Говоря проще, мы связали вывод команды ls и ввод команды less.

Чуть подробнее про использование пайпа мы говорили в заметке про команду grep, которую вы можете найти по ссылке ниже.

Подведем итог

Мы познакомились с тем, что такое потоки ввода/вывода/ошибки и узнали про то, как эти потоки можно перенаправлять. Информация специально была дана в упрощенном виде, чтобы материал оказался понятным большинству читателей статьи. Лучшее усвоение и понимание написанного произойдет в случае практического использования описанных в посте команд и операторов перенаправления потоков. Про любые непонятные моменты пишите в комментариях, я или другие подписчики объяснят что к чему.

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

Теория и практика Linux
Новичкам в мире Linux