Перенаправление ввода-вывода в примерах Linux/Unix

⚡ Умное резюме

Перенаправление в Linux и Unix изменяет способ передачи данных командой: чтение входных данных или отправка выходных данных (swap).ping Клавиатура и экран для работы с файлами или устройствами, использующими такие операторы, как знак «больше», знак «меньше» и оператор добавления.

  • 🔀 Перенаправление: Перенаправление изменяет стандартный ввод или вывод команды с клавиатуры и экрана на файл или устройство.
  • ➡️ Выход: Оператор > записывает результат в файл, а >> добавляет данные в существующий файл, не удаляя его.
  • ⬅️ Входной сигнал: Оператор < передает файл в команду в качестве стандартного ввода вместо ввода с клавиатуры.
  • 🔢 Дескрипторы файлов: Каждому открытому файлу присваивается номер: 0 для стандартного ввода, 1 для стандартного вывода и 2 для стандартной ошибки.
  • ⚠️ Перенаправление при ошибке: Использование оператора 2> отправляет сообщения об ошибках в отдельный файл, чтобы они не засоряли обычный вывод.
  • 🔗 Объединенные потоки: Синтаксис 2>&1 направляет стандартную ошибку в тот же целевой поток, что и стандартный вывод.
  • 🤖 Помощь ИИ: Искусственный интеллект и GitHub Copilot могут создавать и объяснять команды перенаправления и скрипты командной оболочки.

Перенаправление ввода-вывода в Linux и Unix с примерами.

Перенаправление — одна из самых полезных функций. Linux и оболочку Unix, поскольку она позволяет вам решать, куда команда будет считывать входные данные и куда будет отправлять выходные. На этой странице объясняется перенаправление вывода, ввода и ошибок с примерами решения.

Что такое перенаправление?

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

  • Устройство стандартного ввода (stdin) — это клавиатура.
  • Устройство стандартного вывода (stdout) — это экран.

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

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

На приведенном ниже графике показано начало примеров перенаправления вывода.

Графическое изображение заголовка раздела перенаправления вывода

Символ '>' используется для перенаправления вывода (STDOUT).

Пример:

ls -al > listings

В данном случае вывод команды ls -al перенаправляется в файл «listings» вместо отображения на экране. На скриншоте ниже показан результат.

В терминале отображается вывод команды `ls -al`, перенаправленный в файл со списком результатов.

Примечание: При перенаправлении вывода команды в файл используйте правильное имя файла. Если файл с таким же именем уже существует, перенаправленная команда удалит его содержимое, а затем перезапишет его.

Если вы не хотите перезаписывать файл, но хотите добавить содержимое к существующему файлу, используйте оператор '>>'. На скриншоте ниже показано содержимое, добавленное с помощью '>>'.

В терминале отображается вывод команды, добавленный к существующему файлу с помощью оператора двойного деления (больше).

Вы можете перенаправлять стандартный вывод не только в файлы, но и на устройства.

$ cat music.mp3 > /dev/audio

Команда `cat` считывает музыкальный файл.mp3 и отправляет вывод на /dev/audio, которое является аудиоустройством. Если конфигурация звука на вашем ПК верна, эта команда воспроизведет музыкальный файл.mp3.

Перенаправление ввода

На приведенном ниже рисунке показана процедура перенаправления ввода.

Графическое изображение заголовка раздела перенаправления ввода

Символ '<' используется для перенаправления ввода (STDIN).

Пример: Почтовая программа в Linux позволяет отправлять электронные письма прямо из терминала.

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

mail -s "Subject" to-address < Filename

На скриншоте ниже показано, как команда mail считывает файл в качестве входных данных.

Команда mail, использующая перенаправление ввода для прикрепления файла к электронному письму.

Это прикрепляет файл к электронному письму, и оно отправляется получателю.

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

Файл Descriptорс (FD)

В Linux и Unix всё является файлом. Обычные файлы, каталоги и даже устройства — это файлы. Каждому файлу присваивается номер, называемый дескриптором файла (FD).

На приведенной ниже диаграмме показаны стандартные потоки и их файловые дескрипторы.

Диаграмма стандартных потоков ввода, вывода и ошибок, а также их файловых дескрипторов.

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

Ошибка перенаправления

При выполнении программы или команды в терминале всегда открыты три файла: стандартный ввод, стандартный вывод и стандартный поток ошибок.

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

Файл Файл Descriptor
Стандартный ввод STDIN 0
Стандартный вывод STDOUT 1
Стандартная ошибка STDERR 2

По умолчанию поток ошибок отображается на экране. Перенаправление ошибок направляет сообщения об ошибках в файл, отличный от файла на экране.

Почему перенаправление ошибок?

Перенаправление ошибок — одна из самых популярных функций Unix и Linux.

Опытные пользователи Unix знают, что многие команды выдают огромное количество ошибок. Например, при поиске файлов обычно возникает ошибка. разрешение Ошибки, связанные с отклонением запроса, обычно не помогают человеку, ищущему конкретный файл. При выполнении скриптов оболочки часто нежелательно, чтобы сообщения об ошибках засоряли обычный вывод программы.

Решение состоит в том, чтобы перенаправить сообщения об ошибках в файл.

Пример 1

$ myprogram 2>errorsfile

На скриншоте ниже показана эта команда в терминале.

Терминал, в котором запущена моя программа, выдает стандартный поток ошибок, перенаправленный в файл errorsfile.

Выше мы выполняем программу с именем myprogram. Дескриптор файла для стандартного потока ошибок равен 2. Используя «2>», мы перенаправляем вывод ошибок в файл с именем «errorsfile». Таким образом, вывод программы не перегружен ошибками.

Пример 2

Вот ещё один пример использования оператора `find`.

find . -name 'my*' 2>error.log

С помощью команды find мы ищем в текущем каталоге "." файл, имя которого начинается с "my", и отправляем все ошибки в файл error.log.

Пример 3: Рассмотрим более сложный пример.

Администраторы серверов часто перечисляют каталоги и сохраняют как ошибки, так и стандартный вывод в файл для последующей обработки. Вот команда.

ls Documents ABC> dirlist 2>&1

На приведенной ниже диаграмме показано, как оба потока данных объединяются в один файл.

Диаграмма стандартного вывода и стандартной ошибки, перенаправленных в файл dirlist.

Вот:

  • 2>&1 означает, что STDERR перенаправляется в тот же целевой каталог, что и STDOUT (который представляет собой список каталогов файлов).
  • Сообщение об ошибке перенаправляется в стандартный вывод, который, в свою очередь, перенаправляется в список каталогов файла. Таким образом, оба потока записываются в список каталогов файла.

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

Диаграмма, обобщающая перенаправление ввода, вывода и ошибок в Linux и Unix.

Часто задаваемые вопросы (FAQ)

A труба Символ (|) отправляет вывод одной команды непосредственно в другую команду в качестве ее входа. Перенаправление, напротив, соединяет команду с файлом или устройством, записывая в него вывод или считывая из него входные данные. Каналы объединяют команды; перенаправление объединяет команду с файлом.

Оператор > записывает вывод команды в файл, заменяя существующее содержимое. Оператор >> вместо этого добавляет вывод в конец файла, сохраняяping То, что уже есть. Используйте >> всякий раз, когда хотите добавить что-то в файл, а не перезаписать его.

/dev/null — это специальный файл, который отбрасывает все записанные в него данные. Добавление 2>/dev/null к команде перенаправляет сообщения об ошибках в этот файл, незаметно отбрасывая их, так что на экране отображается только обычный вывод. Это распространенный способ скрыть ненужный мусор, содержащий ошибки.

Команда `tee` считывает данные из стандартного ввода и записывает их одновременно на экран и в один или несколько файлов, например, `ls -al | tee listing.txt`. Она позволяет сохранять вывод команды в файл, не отслеживая его при этом на экране.

В документе типа here используется оператор << для передачи нескольких строк встроенного текста в команду в качестве входных данных, заканчивающихся выбранным вами маркерным словом. Это удобно в скриптах командной оболочки для передачи многострочного ввода, например, текста электронного письма, без необходимости создания отдельного файла.

Используйте синтаксис 2>&1 после перенаправления вывода, например, команда > файл 2>&1, чтобы стандартный поток ошибок следовал за стандартным выводом в файл. В современном Bash сокращенная команда &> файл делает то же самое. Порядок имеет значение: поместите 2>&1 после перенаправления вывода.

Искусственный интеллект может преобразовать простой запрос на английском языке в правильную команду перенаправления, объяснить, что делают операторы, такие как 2>&1 или &>, и отметить ошибки до их выполнения. Инструменты машинного обучения также сканируют перенаправленные файлы журналов и ошибок, чтобы выявить аномалии, которые были бы пропущены при ручном анализе.

Да. Второй пилот GitHub может генерировать команды и скрипты, которые перенаправляют ввод, вывод и ошибки из короткого комментария, описывающего цель, и выполняют их по мере ввода. RevПросмотрите любые предлагаемые команды для ваших файлов, особенно те, которые используют символ > и перезаписывают существующие данные.

Подведем итог этой публикации следующим образом: