Введение
Как перенаправить вывод или ввод файлов, команд или процессов в системе Linux? На этот вопрос в инструкции мы дадим ответ! Это может пригодиться для автоматизации неординарной и обычных корпоративных сетей, с помощью скрипта или программы. Ниже вы можете получить как краткий, так и подробный теоретический ответ!
Теория: кратко
Для запуска любой программы в Linux, Windows и других операционных системах нам достаточно щелкнуть на ярлык или исполняемый файл. Но ядро ОС в этот момент создает процесс. Процесс – это пассивная и абстрактная сущность, которая описывает ресурсы и местоположение выполняемой программы. Поэтому если процесс пассивен, то существует и активная сущность – поток.
Каждый процесс имеет 3 стандартных потока: входной, выходной и ошибочный. Они являются фундаментальной частью любой системы. Если мы хотим настроить их использование, для перенаправления потоков, нам необходимо вызвать и указать их в CLI. Это можно сделать с помощью файловых дескрипторов, которые представляют собой номер, присваиваемый потоку, файлу, сетевому сокету и любому элементу операционной системы. Схему логики этого механизма вы можете увидеть ниже:

В результате для перенаправления ввода, вывода или ошибки необходимо использовать команду, приведенную ниже:
cat 0< vocabulary.txt

Для команды cat мы не указывали никаких аргументов для ввода, вместо этого мы написали дескриптор файла для стандартного ввода 0< и дали текст. В результате мы видим записанный текст vocabulary.txt. Механизм файловых дескрипторов может показаться достаточно сложной системой, поэтому для построения логической связки можно рассмотреть главу ниже!
Файловый дескриптор
Представление ресурсов с помощью дескрипторов позволяет различным частям программы обращаться к одному и тому же базовому объекту без необходимости отслеживания его местоположения в памяти, что облегчает манипулирование и управление общими ресурсами. Дескрипторы — это просто целые числа, представляющие открытый файл или другой канал ввода/вывода; они называются дескрипторами, потому что их можно рассматривать как указатели: вместо того чтобы отслеживать, где в памяти хранится конкретный ресурс (что было бы затруднительно при наличии нескольких копий), достаточно знать значение дескриптора и использовать его всякий раз, когда требуется получить доступ к ресурсу.

Например, если приложению необходим доступ сразу к нескольким файлам, то каждый файл может быть представлен своим целочисленным значением: вместо того чтобы отслеживать, где каждый файл хранится в памяти (что было бы затруднительно при наличии нескольких копий), программе достаточно знать значение дескриптора для каждого ресурса и использовать его при каждом обращении к ним. Дескрипторы обычно используются для файлов, но ими не ограничиваются; любой тип системного ресурса может быть представлен одним целочисленным значением: сетевые сокеты или другие типы каналов связи.
В итоге, хотя дескрипторы – это просто целые числа, представляющие открытый файл или другой канал ввода-вывода, они называются дескрипторами, потому что их можно рассматривать как указатели: вместо того чтобы отслеживать, где в памяти хранится конкретный ресурс (что было бы затруднительно при наличии нескольких копий), программе достаточно знать значение его дескриптора и использовать его в любой момент.
Базовые операторы
Итак, после математической части мы можем рассмотреть операторы для перенаправления потока, которые обозначаются знаками.
Стандартный вывод или перенаправление, форма использования: command > output_object. Настроить направление потока, буквально означает, что результат команды не выводится на экран терминала, а перенаправляется на объект. Если файл не существует, то он будет создан системой, если же файл уже существует, то он будет полностью заменен.
Например, у нас есть задача записать все пакеты с именем apache2 из нашего репозитория в файл одной командой или использовать это в скрипте.
apt list | grep "apache2" > apache.txt
После ввода команды нам необходимо увидеть контекст:
tail apache.txt

Но если мы хотим добавить данные в существующий файл, то для этого используем следующую форму: command >> output_object. В отличие от приведенного примера файл не заменяется, но в случае, когда файл не был создан, после ввода команды мы можем увидеть их в каталоге.
Однако если нам необходимо скрыть вывод, то можно воспользоваться специальным устройством в Linux, которое называется null. Их основная функция — отбрасывание выходного потока данных, также таким образом можно перенаправить трафик на другое устройство.
Стандартная ошибка, форма использования: command> output_object. Обычно используется в тех случаях, когда необходимо перенаправить только событие ошибки из всех лог-файлов. Эта команда 2> также, как мы рассмотрели выше, означает создание или замену существующего файла. Мы рассматриваем случай, когда нужно вывести ошибки из запущенной команды ls и перенаправить их в файл:
ls don't_exist_dir 2> err0rs.txt

Если мы хотим добавить какую-либо информацию без замены, то используем уже знакомый оператор 2>>, который создает или добавляет данные в файл. Например:
apt-get errr 2>> err0rs.txt
Посмотрим на результат тестовой операции:
cat err0rs.txt

Как мы видим, новая строка не заменяет весь файл, а операторы перенаправления работают корректно!
Бывают ситуации, когда необходимо использовать одновременно оба оператора, когда мы перехватываем данные от демона или команды, система может записать стандартный вывод и ошибку в один файл:
ls /tmp /jgj &> log.txt
Проверим результат выполнения команды:
cat log.txt

Мы указываем два каталога, один из них выдает ошибку и передается в стандартный вывод, что видно на скриншоте.
Для некоторых ситуаций необходимо построить более сложную переадресацию. Представьте, что вам нужно отсортировать объекты из файла и записать его в новый файл:
sort < err0rs.txt > sort_err0rs.txt

Давайте объясним, как это работает! Сначала мы выполняем направление в stdinput из err0rs.txt, затем в команду sort и результат этой операции в файл s0rt_err0rs.txt.
Вы можете заметить, что для перенаправления на устройство или в файл мы используем стандартные операторы, но что если перенаправить вывод нашей команды на ввод другой команды? К сожалению, описанные выше операторы не подходят под наши критерии. Для этих целей существует pipe. Что это значит? В буквальном смысле — труба! Обозначается знаком | и используется в форме: command_1 | command_2:
apt list | grep "apache2"

Строка команд вначале собирает данные из команды apt записывает в stdoutput и перенаправляет в stdinput без proxy-файла! Аналогичным образом с помощью стандартных операторов это будет выглядеть следующим образом:
apt list >> proxy_file.txt >> grep "apache2"
В этом случае мы используем proxy-файл и сохраняем информацию в нем!
Вывод
Понимание того, как использовать операторы перенаправления в Bash, является фундаментальным навыком для всех, кто работает с командной строкой в Unix-подобных операционных системах. Эти операторы предоставляют мощный способ манипулирования входными и выходными потоками, позволяя эффективно работать с данными и процессами. Освоив такие понятия, как <, >, >>, 2> и &>, вы сможете не только перенаправлять данные, но и эффективно комбинировать, добавлять и управлять ошибками.