Изучите основы работы ввода/вывода в Linux (Input/Output Redirection)

Одной из самых важных и интересных тем в администрировании Linux является перенаправление ввода/вывода. Эта функция командной строки позволяет перенаправлять ввод и/или вывод команд из и/или в файлы, а также объединять несколько команд вместе с использованием каналов для формирования так называемого “конвейера команд” (command pipeline).

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

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

В Linux и других системах Unix-подобных системах есть три предопределенных файла, названных ниже, которые также определяются оболочкой с использованием номеров дескрипторов файлов:

  1. stdin или 0 – он подключен к клавиатуре, большинство программ читают ввод из этого файла.
  2. stdout или 1 – он прикреплен к экрану, и все программы отправляют свои результаты в этот файл и
  3. stderr или 2 – программы отправляют сообщения о статусе/ошибки в этот файл, который также прикреплен к экрану.

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

Как перенаправить стандартный вывод в файл в Linux

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

$ top -bn 5 >top.log

Где флаги:

  1. -b – позволяет top работать в пакетном режиме, чтобы можно было перенаправить его вывод в файл или другую команду.
  2. -n – указывает количество итераций перед завершением команды.

Вы можете просмотреть содержимое файла top.log с помощью команды cat следующим образом:

$ cat top.log

Чтобы добавить вывод команды, используйте оператор “>>”.

Например, чтобы добавить вывод команды top в файл top.log внутри скрипта (или в командной строке), введите следующую строку:

$ top -bn 5 >>top.log

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

$ top -bn 5 1>top.log

Как перенаправить стандартную ошибку в файл в Linux

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

Например, команда ls ниже вызовет ошибку при выполнении обычным пользователем без привилегий root:

$ ls -l /root/

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

$ ls -l /root/ 2>ls-error.log
$ cat ls-error.log 
Redirect Standard Error to File

Для добавления стандартной ошибки используйте команду ниже:

$ ls -l /root/ 2>>ls-error.log

Как перенаправить стандартный вывод/ошибку в один файл

Также возможно захватить всю информацию команды (как стандартный вывод, так и стандартную ошибку) в один файл. Это можно сделать двумя способами, указав номера дескрипторов файла:

1. Первый – относительно старый метод, который работает следующим образом:

$ ls -l /root/ >ls-error.log 2>&1

Команда выше означает, что оболочка сначала отправит вывод команды ls в файл ls-error.log (используя >ls-error.log), а затем запишет все сообщения об ошибках в дескриптор файла 2 (стандартный вывод), который был перенаправлен в файл ls-error.log (используя 2>&1). Это означает, что стандартная ошибка также отправляется в тот же файл, что и стандартный вывод.

2. Второй – прямой метод:

$ ls -l /root/ &>ls-error.log

Вы также можете добавить стандартный вывод и стандартную ошибку в один файл следующим образом:

$ ls -l /root/ &>>ls-error.log

Как перенаправить стандартный ввод в файл

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

Для перенаправления стандартного ввода из файла, отличного от клавиатуры, используйте оператор «<» следующим образом:

$ cat <domains.list 
Redirect Standard Input to File

Как перенаправить стандартный ввод/вывод в файл

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

$ sort <domains.list >sort.output

Как использовать перенаправление ввода/вывода с помощью каналов

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

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

$ ls -lt | head -n 5 

Здесь опции:

  1. -l – включает формат длинного списка
  2. -tсортирует по времени модификации с самыми новыми файлами отображаются первыми
  3. -n – указывает количество строк заголовка для отображения

Важные команды для создания конвейеров

Здесь мы кратко рассмотрим две важные команды для создания командных конвейеров и они:

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

$ echo /home/aaronkilik/test/ /home/aaronkilik/tmp | xargs -n 1 cp -v /home/aaronkilik/bin/sys_info.sh
Copy Files to Multiple Directories

И параметры:

  1. -n 1 – указывает xargs использовать не более одного аргумента на командную строку и отправить в команду cp
  2. cp – копирует файл
  3. -vотображает ход выполнения команды копирования.

Для получения дополнительных вариантов использования и информации ознакомьтесь с руководством xargs.

$ man xargs 

A tee command reads from standard input and writes to standard output and files. We can demonstrate how tee works as follows:

$ echo "Testing how tee command works" | tee file1 
tee Command Example

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

Чтобы узнать больше о фильтрах и каналах Linux, прочтите эту статью Найти Топ 10 IP-адресов, обращающихся к серверу Apache, показывает полезный пример использования фильтров и каналов.

В этой статье мы объяснили основы перенаправления ввода/вывода в Linux. Не забудьте поделиться своими мыслями через раздел обратной связи ниже.

Source:
https://www.tecmint.com/linux-io-input-output-redirection-operators/