В сегодняшней публикации поговорим о такой часто используемой Linux-сисадминами возможности оболочки, интерпретатора команд Linux, как перенаправление трех стандартных потоков ввода / вывода данных. Благодаря этому можно осуществлять вывод команд в файл, передавать файлы на ввод команды, объединять команды и создавать из них цепочки.
Механизм перенаправления ввода-вывода
При выполнении всех команд к пользователю возвращаются три типа данных: результат выполнения (обычно текстовая информация, запрошенная пользователем), сообщения об ошибках (информация о ходе выполнения команды и возникших проблемах) и код возврата (числовая оценка правильности выполнения команды).
Как известно, в Linux все типы данных считаются файлами. Каждый дистрибутив содержит три главных файла потоков, доступные для использования программами: standard input, standard output и standard error. Они определяются оболочкой и идентифицируются по номеру дескриптора файла: «0», «1» и «2» соответственно.
Перенаправление ввода / вывода дает возможность для замены одного из этих файлов на свой. Так, например, можно можно добиться того, чтобы программа считывала данные из файла в файловой системе, а не с клавиатуры или чтобы ошибки выводились сразу в файл, а не на экран и т.д. также можете выводить ошибки в файл, а не на экран и т д.
Осуществляется это посредством операторов «>» и «<» в разных конфигурациях команд, вводимых с терминала и отвечающих за то, куда конкретно должны перенаправляться данные.
Стандартный поток ввода (standard input), системный дескриптор «0»
Информация, транслируемая в терминал, такая как инструкции, которые поступают в оболочку для выполнения. Как правило, данные этого потока вводятся пользователем с клавиатуры. Однако можно заставить программу считывать данные из файла, использовав оператор «<». Также можно той же командой сразу перенаправить в файл и вывод, пересортировав список.
Стандартный поток вывода (standard output), системный дескриптор «1»
Информация, поступающая в окно терминала из оболочки после выполнения команд. Перенаправление вывода в файл осуществляется с помощью оператора «>». Например, сохраняя вывод команды, можно заставить работать программу в неинтерактивном пакетном режиме и повторять операцию нужно число раз для получения информации обо всех процессах. В других командах символ «>» может перезаписывать информацию из файла, если там уже что-то есть. Если информацию требуется добавить в конец файла – необходимо применить «>>».
Стандартный поток ошибок (standard error), системный дескриптор «2»
Похож на предыдущий с точки зрения места поступления информации, являясь при этом его частным случаем. При обработке больших массивов данных служит для выделения сообщений об ошибках в отдельный поток, не давая им смешиваться с полезной информацией, которая идет в standard output; для перенаправления вывода ошибок в файл требуется указать его дескриптор. Если же потребности в разделении данных нет и весь вывод нужно перенаправить в один файл, нужно указать оба дескриптора. Сначала произойдет отправка вывода команды ls в файл ls-error.log посредством первого оператора перенаправления. Затем в тот же файл поступят все ошибки.
Конгломераты команд
По мере освоения перенаправления в Linux можно начать работать не только с файлами, но и перенаправлять вывод одной команды в качестве ввода другой, что может существенно упростить некоторые сложные операции. В качестве примера выведем три файла, которые недавно были изменены. Утилита «xargs» позволяет комбинировать команды так, что стандартный ввод будет транслироваться в параметры.
Например создадим в нескольких папках копию одного файла. Параметр «n» со значением «1» здесь будет означать, что для одной команды потребуется подстановка лишь одного параметра, а опция «v» в «cp» даст возможность для вывода информации о перемещениях. Также следует взять на вооружение такую команду как «tee», которая считывает данные из стандартного ввода и записывает в стандартный вывод или файлы.
Вместо итогов
В этой публикации мы затронули лишь общую механику перенаправления потоков в интерпретаторе командной строки Linux, однако кому-то она может дать толчок к тому, чтобы разбираться с этой темой глубже, а кому-то – поможет освежить в памяти некоторые принципы работы с терминалом. Как и все остальное, перенаправление потоков нуждается в практике и тут можно лишь порекомендовать не бояться самостоятельно экспериментировать с «>» и «<».