3.8.4.4 Сохранение в файл вывода консоли
Скачать документ Перенаправление стандартного вывода
Перенаправление вывода ошибок
Перенаправление стандартного вывода и стандартного вывода ошибок в один файл
Перенаправление стандартного ввода
Конвейеры
Многие программы выводят в консоль какую-либо информацию. Этот вывод часто делится на два типа:
Результаты работы программы, т.е. данные, для получения которых и создавалась эта программа;
Сообщения о состоянии или об ошибках.
Например, если посмотреть на вывод программы ls
, можно увидеть, что она выводит на экран результаты своей работы и иногда сообщения об ошибках. Согласно основной идее Unix, что «всё — есть файл», программы, в действительности, выводят свои результаты в специальный файл, который называется стандартным выводом или стандартным потоком вывода (часто обозначается как stdout), а сообщения о состоянии — в специальный файл стандартный вывод ошибок или поток ошибок (stderr). По умолчанию оба эти потока связаны с экраном и не сохраняются на диске.
Кроме того, многие программы принимают ввод из специального файла с названием стандартный ввод или стандартный поток ввода (stdin), который по умолчанию связан с клавиатурой.
Механизм перенаправления ввода/вывода позволяет изменять направление вывода и ввода. Обычно вывод осуществляется на экран, а ввод — с клавиатуры, но механизм перенаправления ввода/вывода позволяет изменить этот порядок.
Вы можете подробнее ознакомиться с перенаправлением вывода консоли в файл, просмотрев наши обучающие видео:
на RuTube — Перенаправление в bash;
в Яндекс.Дзен — Перенаправление в bash;
в VK Видео — Перенаправление в bash.
На наших каналах вы также сможете найти много другой полезной информации.
Перенаправление стандартного вывода
Механизм перенаправления ввода/вывода позволяет явно указать, куда должен осуществляться стандартный вывод. Чтобы перенаправить стандартный вывод в файл вместо экрана, нужно добавить в команду оператор перенаправления «>» и имя файла. Например, можно сообщить командной оболочке, что она должна направить вывод команды ls
в файл вместо экрана:
ls /usr/bin > listing.txt
Просмотрев содержимое файла (например, командной cat listing.txt
), можно увидеть ту же информацию, как если бы вывод осуществлялся непосредственно в консоль.
Теперь попробуйте выполнить предыдущую команду, но для другого каталога, например:
ls /etc > listing.txt
Затем просмотрите содержимое файла. Вы увидите, что старая информация в нём была перезаписана. Это объясняется тем, что при перенаправлении вывода с помощью оператора «>» файл назначения всегда перезаписывается с самого начала.
Если понадобится очистить какой-нибудь файл (или создать новый, пустой файл), это можно сделать с помощью команды:
> listing.txt
Простой оператор перенаправления, без предшествующей ему команды, очистит существующий файл или создаст новый, пустой файл.
Для добавления вывода в конец существующего файла без перезаписи необходимо использовать оператор перенаправления «>>»:
ls /etc >> listing.txt
Оператор «>>» просто добавит результаты в конец файла. Если файл не существует, он будет создан, как при использовании оператора «>».
Перенаправление вывода ошибок
При попытке перенаправить вывод с указанием имени несуществующего каталога командой:
ls /folder > listing.txt
На экран будет выведено следующее сообщение:
ls: невозможно получить доступ к '/folder': Нет такого файла или каталога
Однако сообщение об ошибке выведено в терминал, а не в файл. Дело в том, что обычно программы не выводят сообщения об ошибках в стандартный вывод — они выводят сообщения об ошибках в поток ошибок.
Поскольку перенаправлен только стандартный вывод, а стандартный вывод ошибок — нет, сообщение об ошибке появилось на экране терминала.
Перенаправление стандартного вывода ошибок осуществляется не так просто, как стандартного вывода. Чтобы перенаправить поток ошибок, нужно указать его дескриптор файла.
Первые три потока (иными словами — стандартных файла) были уже упомянуты как стандартный ввод, вывод и вывод ошибок. К ним можно обратиться по их уникальным цифровым идентификаторам, которые и называются файловыми дескрипторами:
Стандартный файловый поток | Дескриптор |
---|---|
Ввода | 0 |
Вывода | 1 |
Ошибок | 2 |
Командная оболочка ссылается на стандартные потоки как на файлы по их дескрипторам (иногда говорят, «номерам потока»). Так как стандартному потоку ошибок соответствует файловый дескриптор 2, можно перенаправить его, например, таким образом:
ls /folder 2> listerrors.txt
Номер файлового дескриптора помещается непосредственно перед оператором перенаправления, без пробела!
Теперь на экран не выводится сообщение об ошибке.
Перенаправление стандартного вывода и стандартного вывода ошибок в один файл
Для перенаправления всего вывода в один файл необходимо поток ошибок направить в поток вывода, а его, в свою очередь, перенаправить в файл. Например:
ls /etc > listing.txt 2>&1
Обратите внимание, что порядок перенаправления играет важную роль! Перенаправление стандартного вывода ошибок всегда должно производиться после перенаправления стандартного вывода, иначе команда сработает не так, как ожидается.
Если порядок перенаправления изменить, как показано ниже, стандартный вывод ошибок будет перенаправлен на экран:
ls /etc 2>&1 > listing.txt
Версия bash, имеющаяся в РЕД ОС, поддерживает и другой, более короткий способ написания данного перенаправления:
ls /etc &> listing.txt
В примере используется единственный оператор &>, перенаправляющий стандартный вывод и стандартный вывод ошибок в файл listing.txt. Аналогично можно перенаправить стандартный вывод и стандартный вывод ошибок с добавлением в конец одного и того же файла:
ls /etc &>> listing.txt
Между символами в операторе перенаправления не должно быть пробелов!
Иногда случаются ситуации, когда вывод программы совсем не нужен, его желательно не просто перенаправить в файл, а перенаправить в никуда. Для этого достаточно указать в качестве целевого файла для перенаправления вывода специальный файл /dev/null
. Этот файл представляет системное устройство, называемое битоприёмником (bit bucket), которое принимает любой ввод и ничего с ним не делает. Например:
ls /etc > /dev/null ls /etc 2> /dev/null ls /etc &> /dev/null
Перенаправление стандартного ввода
Выше использовалась команда cat listing.txt
для вывода содержимого файла на экран терминала. Утилита (cat) может принимать данные как прямым чтением из файла (как в примере), так и считыванием из потока ввода (напрямую с клавиатуры или из перенаправленного потока), а получив данные, утилита cat выводит их в стандартный поток вывода (обычно — это экран).
В качестве примера содержимое файла с листингом будет направлено в поток ввода, для этого выполните следующую команду:
cat < listing.txt
На экране будет показано всё то же содержимое листинга.
Таким способом можно подать на вход программе, читающей данные из потока ввода, информацию из файла.
Конвейеры
Умение команд читать данные со стандартного ввода и выводить результаты в стандартный вывод используется механизмом командной оболочки, который называется конвейером. С помощью оператора конвейера «|» (вертикальная черта) стандартный вывод одной команды можно связать со стандартным вводом другой:
<команда_1> | <команда_2>
Для демонстрации этого механизма понадобится несколько команд. Например, необходимо получить листинг всего содержимого папки /etc, включая все подкаталоги, и вывести на экран только имена с расширением .conf. Для выбора строк по заданному шаблону применяется утилита grep, которая, как и cat, может принимать данные как из файла, так и из потока ввода. Перенаправьте вывод команды ls -R
на ввод команде grep "\.conf"
:
ls -R /etc | grep "\.conf"
Если данный вывод необходимо сохранить в файл для дальнейшей работы, то операторы перенаправления и конвейеры можно сочетать в одной комбинированной команде. Например:
ls -R /etc | grep "\.conf" > list_of_conf.txt
Важно отметить, что можно сочетать несколько конвейеров в одной составной команде. Такие команды часто называют фильтрами.
Дата последнего изменения: 14.10.2024
Если вы нашли ошибку, пожалуйста, выделите текст и нажмите Ctrl+Enter.