Поиск по сайту:

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


Введение

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

Предпосылки

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

Потоки

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

  • стандартный ввод (stdin)
  • стандартный вывод (stdout)
  • стандартная ошибка (stderr)

Потоки также пронумерованы:

  • стандарт (0)
  • стандартный вывод (1)
  • стдерр (2)

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

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

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

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

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

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

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

Запустить эхо без каких-либо аргументов:

  1. echo

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

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

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

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

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

  1. ls %

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

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

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

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

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

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

перезаписать

  • > - стандартный вывод
  • < - стандартный ввод
  • 2> - стандартная ошибка

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

Добавить

  • >> - стандартный вывод
  • << - стандартный ввод
  • 2>> - стандартная ошибка

Трубы

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

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

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

  1. ls | less

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

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

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

Фильтры

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

  • find — возвращает файлы с именами, соответствующими аргументу, переданному для поиска.
  • grep — возвращает текст, соответствующий шаблону строки, переданному в grep.
  • tee — перенаправляет стандартный ввод как на стандартный вывод, так и в один или несколько файлов.
  • tr — находит и заменяет одну строку на другую.
  • wc - считает символы, строки и слова.

Примеры

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

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

  1. ls ~ > root_dir_contents.txt

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

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

  1. ls > /dev/null

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

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

  1. mkdir '' 2> mkdir_log.txt

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

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

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

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

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

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

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

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

  1. find /var lib | grep deb

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

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

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

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

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

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

Заключение

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

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