news
Serverspace добавил возможность подключения S3 к сервису CDN
KA
15 ноября 2023
Обновлено 15 ноября 2023

Как использовать операторы перенаправления в Bash?

Linux

Введение

Как перенаправить вывод или ввод файлов, команд или процессов в системе Linux? На этот вопрос в инструкции мы дадим ответ! Это может пригодиться для автоматизации неординарной и обычных корпоративных сетей, с помощью скрипта или программы. Ниже вы можете получить как краткий, так и подробный теоретический ответ!

Теория: кратко

Для запуска любой программы в Linux, Windows и других операционных системах нам достаточно щелкнуть на ярлык или исполняемый файл. Но ядро ОС в этот момент создает процесс. Процесс – это пассивная и абстрактная сущность, которая описывает ресурсы и местоположение выполняемой программы. Поэтому если процесс пассивен, то существует и активная сущность – поток.

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

Схема работы дескриптора
Скриншот №1 — Схема работы дескриптора

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

cat 0< vocabulary.txt
Пример команды
Скриншот №2 — Пример команды

Для команды cat мы не указывали никаких аргументов для ввода, вместо этого мы написали дескриптор файла для стандартного ввода 0< и дали текст. В результате мы видим записанный текст vocabulary.txt. Механизм файловых дескрипторов может показаться достаточно сложной системой, поэтому для построения логической связки можно рассмотреть главу ниже!

Файловый дескриптор

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

Подробная схема работы механизма
Скриншот №3 — Подробная схема работы механизма

Например, если приложению необходим доступ сразу к нескольким файлам, то каждый файл может быть представлен своим целочисленным значением: вместо того чтобы отслеживать, где каждый файл хранится в памяти (что было бы затруднительно при наличии нескольких копий), программе достаточно знать значение дескриптора для каждого ресурса и использовать его при каждом обращении к ним. Дескрипторы обычно используются для файлов, но ими не ограничиваются; любой тип системного ресурса может быть представлен одним целочисленным значением: сетевые сокеты или другие типы каналов связи.

В итоге, хотя дескрипторы – это просто целые числа, представляющие открытый файл или другой канал ввода-вывода, они называются дескрипторами, потому что их можно рассматривать как указатели: вместо того чтобы отслеживать, где в памяти хранится конкретный ресурс (что было бы затруднительно при наличии нескольких копий), программе достаточно знать значение его дескриптора и использовать его в любой момент.

Базовые операторы

Итак, после математической части мы можем рассмотреть операторы для перенаправления потока, которые обозначаются знаками.

Стандартный вывод или перенаправление, форма использования: command > output_object. Настроить направление потока, буквально означает, что результат команды не выводится на экран терминала, а перенаправляется на объект. Если файл не существует, то он будет создан системой, если же файл уже существует, то он будет полностью заменен.

Например, у нас есть задача записать все пакеты с именем apache2 из нашего репозитория в файл одной командой или использовать это в скрипте.

apt list | grep "apache2" > apache.txt

После ввода команды нам необходимо увидеть контекст:

tail apache.txt
Перенаправление вывода
Скриншот №4 — Перенаправление вывода

Но если мы хотим добавить данные в существующий файл, то для этого используем следующую форму: command >> output_object. В отличие от приведенного примера файл не заменяется, но в случае, когда файл не был создан, после ввода команды мы можем увидеть их в каталоге.

Однако если нам необходимо скрыть вывод, то можно воспользоваться специальным устройством в Linux, которое называется null. Их основная функция — отбрасывание выходного потока данных, также таким образом можно перенаправить трафик на другое устройство.

Стандартная ошибка, форма использования: command> output_object. Обычно используется в тех случаях, когда необходимо перенаправить только событие ошибки из всех лог-файлов. Эта команда 2> также, как мы рассмотрели выше, означает создание или замену существующего файла. Мы рассматриваем случай, когда нужно вывести ошибки из запущенной команды ls и перенаправить их в файл:

ls don't_exist_dir 2> err0rs.txt
Перенаправление вывода ошибок
Скриншот №5 — Перенаправление вывода ошибок

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

apt-get errr 2>> err0rs.txt

Посмотрим на результат тестовой операции:

cat err0rs.txt
Дополнительный оператор
Скриншот №6 — Дополнительный оператор

Как мы видим, новая строка не заменяет весь файл, а операторы перенаправления работают корректно!

Бывают ситуации, когда необходимо использовать одновременно оба оператора, когда мы перехватываем данные от демона или команды, система может записать стандартный вывод и ошибку в один файл:

ls /tmp /jgj &> log.txt

Проверим результат выполнения команды:

cat log.txt
Перенаправление в один файл
Скриншот №7 — Перенаправление в один файл

Мы указываем два каталога, один из них выдает ошибку и передается в стандартный вывод, что видно на скриншоте.

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

sort < err0rs.txt > sort_err0rs.txt
Составное перенаправление
Скриншот №8 — Составное перенаправление

Давайте объясним, как это работает! Сначала мы выполняем направление в stdinput из err0rs.txt, затем в команду sort и результат этой операции в файл s0rt_err0rs.txt.

Вы можете заметить, что для перенаправления на устройство или в файл мы используем стандартные операторы, но что если перенаправить вывод нашей команды на ввод другой команды? К сожалению, описанные выше операторы не подходят под наши критерии. Для этих целей существует pipe. Что это значит? В буквальном смысле — труба! Обозначается знаком | и используется в форме: command_1 | command_2:

apt list | grep "apache2"
Pipe
Скриншот №9 — Pipe

Строка команд вначале собирает данные из команды apt записывает в stdoutput и перенаправляет в stdinput без proxy-файла! Аналогичным образом с помощью стандартных операторов это будет выглядеть следующим образом:

apt list >> proxy_file.txt >> grep "apache2"

В этом случае мы используем proxy-файл и сохраняем информацию в нем!

Вывод

Понимание того, как использовать операторы перенаправления в Bash, является фундаментальным навыком для всех, кто работает с командной строкой в Unix-подобных операционных системах. Эти операторы предоставляют мощный способ манипулирования входными и выходными потоками, позволяя эффективно работать с данными и процессами. Освоив такие понятия, как <, >, >>, 2> и &>, вы сможете не только перенаправлять данные, но и эффективно комбинировать, добавлять и управлять ошибками.

Оценка:
5 из 5
Аverage rating : 5
Оценок: 1
191028 Санкт-Петербург Литейный пр., д. 26, Лит. А
+7 (812) 403-06-99
700 300
ООО «ИТГЛОБАЛКОМ ЛАБС»
700 300

Вам также может быть интересно...