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

Введение

Встроенные возможности перенаправления в Linux предоставляют вам надежный набор инструментов для оптимизации многих рабочих процессов. Философия разработки программного обеспечения “Unix” заключалась в создании инструментов, каждый из которых хорошо выполняет свою задачу, и эта философия была продолжена в современных инструментах командной строки, которые являются индивидуально мощными и экспоненциально более мощными в комбинации. Независимо от того, пишете ли вы сложное программное обеспечение или просто работаете в командной строке, знание того, как манипулировать различными потоками ввода-вывода в вашей среде, значительно повысит вашу продуктивность.

Предварительные требования

Для выполнения этого руководства вам понадобится доступ к серверу Linux. Если вам нужна информация о подключении к вашему серверу в первый раз, вы можете следовать нашему руководству по подключению к серверу Linux с помощью SSH.

Потоки

Ввод и вывод в среде Linux распределены по трем потокам. Эти потоки:

  • стандартный ввод (stdin)

  • стандартный вывод (stdout)

  • стандартная ошибка (stderr)

Потоки также имеют номера:

  • stdin (0)

  • stdout (1)

  • stderr (2)

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

Стандартный ввод

Стандартный ввод обычно перенаправляет данные от пользователя к программе. Программы, ожидающие стандартный ввод, обычно получают ввод с устройства, такого как клавиатура. Позже в этом руководстве вы увидите примеры использования вывода одной программы в качестве стандартного ввода для другой.

Стандартный вывод

Стандартный вывод – это вывод, генерируемый программой. Когда поток стандартного вывода не перенаправлен, текст будет выводиться непосредственно на терминал. Попробуйте вывести произвольный текст с помощью команды echo:

  1. echo Sent to the terminal
Output
Sent to the terminal

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

Запустите echo без аргументов:

  1. echo

Он вернет пустую строку. Некоторые программы не делают ничего без предоставленных аргументов.

Стандартная ошибка

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

Давайте рассмотрим простой пример стандартной ошибки, используя команду ls. ls перечисляет содержимое каталога.

Когда выполняется без аргумента, ls перечисляет содержимое текущего каталога. Если ls запущена с каталогом в качестве аргумента, она перечислит содержимое указанного каталога.

  1. ls %

Поскольку % не является существующим каталогом, это отправит следующий текст в стандартный вывод:

Output
ls: cannot access %: No such file or directory

A program does not have to crash or finish running in order to generate Standard Error, and whether some output is sent to either Standard Output or Standard Error is down to the behavior of the program. They are not technically different from one another in any way — just that one output stream is supposed to be reserved for error messages, and some tools will assume that Standard Error being empty means that a program ran successfully. Some programs will even output minor errors to Standard Error without crashing or failing to also produce the intended output. It is only used as a convention to separate intended output from unintended output.

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

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

Команды с одним угловым скобками перезаписывают существующее содержимое назначения.

Перезапись

  • > – стандартный вывод

  • < – стандартный ввод

  • 2> – стандартная ошибка

Команды с двумя угловыми скобками не перезаписывают существующее содержимое назначения.

Добавление

  • >> – стандартный вывод

  • << – стандартный ввод

  • 2>> – стандартная ошибка

Каналы

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

Канал Linux представлен вертикальной чертой: |

Вот пример команды с использованием канала:

  1. ls | less

Это берет вывод команды ls, которая отображает содержимое вашего текущего каталога, и направляет его в программу less. less отображает данные, отправленные в него, по одной строке за раз.

ls обычно отображает содержимое каталога по нескольким строкам. Когда вы запускаете его через less, каждая запись помещается на новую строку.

Хотя функциональность канала может показаться аналогичной функциональности > и >>, отличие заключается в том, что каналы перенаправляют данные от одной команды к другой, в то время как > и >> используются исключительно для перенаправления в файлы.

Фильтры

Фильтры – это класс программ, которые обычно используются с выводом, направляемым из другой программы. Многие из них также полезны самостоятельно, но они особенно хорошо иллюстрируют поведение канализации.

  • find – возвращает файлы с именами файлов, которые соответствуют аргументу, переданному в find.

  • grep – возвращает текст, который соответствует строковому шаблону, переданному в grep.

  • tee – перенаправляет стандартный ввод как на стандартный вывод, так и на один или несколько файлов.

  • tr – находит и заменяет одну строку другой.

  • wc – подсчитывает символы, строки и слова.

Примеры

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

Шаблон команда > файл перенаправляет стандартный вывод команды в файл.

  1. ls ~ > root_dir_contents.txt

Приведенная выше команда передает содержимое вашего домашнего каталога (~) в качестве стандартного вывода и записывает вывод в файл с именем root_dir_contents.txt. Она удалит любое предыдущее содержимое файла, так как это одиночная команда с одной скобкой.

Шаблон команда > /dev/null перенаправляет стандартный вывод в никуда. /dev/null – это специальный файл, который используется для удаления любых данных, которые перенаправляются в него. Он используется для отбрасывания стандартного вывода, который не нужен и который в противном случае мог бы помешать работе команды или скрипта. Любой вывод, отправленный в /dev/null, отбрасывается.

  1. ls > /dev/null

Эта команда отбрасывает стандартный вывод, возвращаемый потоком команды ls, передав его в /dev/null.

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

  1. mkdir '' 2> mkdir_log.txt

Этот код перенаправляет ошибку, возникшую при недопустимом имени каталога '', и записывает ее в log.txt. Обратите внимание, что ошибка все равно отправляется на терминал и отображается как текст.

Шаблон команда >> файл перенаправляет стандартный вывод команды в файл без перезаписи существующего содержимого файла.

  1. echo Written to a new file > data.txt
  2. echo Appended content to an existing file >> data.txt

Эта пара команд сначала перенаправляет текст, введенный пользователем через echo, в новый файл. Затем она добавляет текст, полученный второй командой echo, к существующему файлу, не перезаписывая его содержимое.

Шаблон command 2>> file, указанный выше, перенаправляет поток стандартной ошибки команды в файл без перезаписи существующего содержимого файла. Этот шаблон полезен для создания журналов ошибок для программы или службы, так как содержимое журнала не будет стираться при каждой записи в файл.

  1. find '' 2> stderr_log.txt
  2. wc '' 2>> stderr_log.txt

Вышеуказанная команда перенаправляет сообщение об ошибке, вызванное недопустимым аргументом find, в файл с именем stderr_log.txt. Затем она добавляет сообщение об ошибке, вызванное недопустимым аргументом wc, в тот же файл.

Шаблон command | command перенаправляет стандартный вывод первой команды на стандартный ввод второй команды.

  1. find /var lib | grep deb

Эта команда ищет в /var и его подпапках имена файлов и расширения, соответствующие строке deb, и возвращает пути к файлам, с подходящей частью в каждом пути, выделенной красным цветом.

Шаблон command | tee file (включающий команду tee) перенаправляет стандартный вывод команды в файл и перезаписывает его содержимое. Затем он отображает перенаправленный вывод в терминале. Создается новый файл, если файл еще не существует.

В контексте этого шаблона tee обычно используется для просмотра вывода программы одновременно с сохранением его в файл.

  1. wc /etc/magic | tee magic_count.txt

Это направляет количество символов, строк и слов в файле /etc/magic (используемом оболочкой Linux для определения типов файлов) в команду tee, которая затем разделяет вывод wc на два направления и отправляет его на терминал и в файл magic_count.txt. Для команды tee представьте букву Т. Нижняя часть буквы – это исходные данные, а верхняя часть – данные, разделяемые на два разных направления (стандартный вывод и терминал).

Можно использовать несколько каналов для перенаправления вывода через несколько команд и/или фильтров.

Вывод

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

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

Source:
https://www.digitalocean.com/community/tutorials/an-introduction-to-linux-i-o-redirection