Одной из самых важных и интересных тем в администрировании Linux является перенаправление ввода/вывода. Эта функция командной строки позволяет перенаправлять ввод и/или вывод команд из и/или в файлы, а также объединять несколько команд вместе с использованием каналов для формирования так называемого “конвейера команд” (command pipeline).
Все команды, которые мы выполняем, в основном производят два вида вывода:
- результат выполнения команды – данные, которые программа предназначена для производства, и
- статус программы и сообщения об ошибках, которые информируют пользователя о деталях выполнения программы.
В Linux и других системах Unix-подобных системах есть три предопределенных файла, названных ниже, которые также определяются оболочкой с использованием номеров дескрипторов файлов:
- stdin или 0 – он подключен к клавиатуре, большинство программ читают ввод из этого файла.
- stdout или 1 – он прикреплен к экрану, и все программы отправляют свои результаты в этот файл и
- stderr или 2 – программы отправляют сообщения о статусе/ошибки в этот файл, который также прикреплен к экрану.
Таким образом, перенаправление ввода/вывода позволяет изменять источник ввода команды, а также то, куда отправляются ее вывод и сообщения об ошибках. И это становится возможным благодаря операторам перенаправления "<"
и ">"
.
Как перенаправить стандартный вывод в файл в Linux
Вы можете перенаправить стандартный вывод, как показано в примере ниже, здесь мы хотим сохранить вывод команды top для последующего анализа:
$ top -bn 5 >top.log
Где флаги:
-b
– позволяет top работать в пакетном режиме, чтобы можно было перенаправить его вывод в файл или другую команду.-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

Для добавления стандартной ошибки используйте команду ниже:
$ 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

Как перенаправить стандартный ввод/вывод в файл
Вы можете одновременно выполнять перенаправление стандартного ввода и стандартного вывода с использованием команды sort следующим образом:
$ sort <domains.list >sort.output
Как использовать перенаправление ввода/вывода с помощью каналов
Для перенаправления вывода одной команды в качестве ввода для другой вы можете использовать каналы, что является мощным средством для создания полезных командных строк для сложных операций.
Например, следующая команда покажет пять последних измененных файлов.
$ ls -lt | head -n 5
Здесь опции:
-l
– включает формат длинного списка-t
– сортирует по времени модификации с самыми новыми файлами отображаются первыми-n
– указывает количество строк заголовка для отображения
Важные команды для создания конвейеров
Здесь мы кратко рассмотрим две важные команды для создания командных конвейеров и они:
xargs, который используется для создания и выполнения командных строк из стандартного ввода. Ниже приведен пример конвейера, который использует xargs, эта команда используется для копирования файла в несколько каталогов в Linux:
$ echo /home/aaronkilik/test/ /home/aaronkilik/tmp | xargs -n 1 cp -v /home/aaronkilik/bin/sys_info.sh

И параметры:
-n 1
– указывает xargs использовать не более одного аргумента на командную строку и отправить в команду cpcp
– копирует файл-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

Файловые или текстовые фильтры часто используются с помощью каналов для эффективных операций с файлами в Linux, чтобы обрабатывать информацию мощными способами, такими как перестройка вывода команд (это может быть важным для генерации полезных отчетов в Linux), изменение текста в файлах плюс несколько других задач администрирования системы Linux.
Чтобы узнать больше о фильтрах и каналах Linux, прочтите эту статью Найти Топ 10 IP-адресов, обращающихся к серверу Apache, показывает полезный пример использования фильтров и каналов.
В этой статье мы объяснили основы перенаправления ввода/вывода в Linux. Не забудьте поделиться своими мыслями через раздел обратной связи ниже.
Source:
https://www.tecmint.com/linux-io-input-output-redirection-operators/