Перенаправление стандартного потока ошибок и объединение потоков
На этом шаге вы узнаете, как перенаправлять стандартный вывод ошибок (stderr) и как объединять stdout и stderr в один поток. Это имеет решающее значение для управления сообщениями об ошибках, генерируемыми командами, позволяя вам регистрировать их или отбрасывать по мере необходимости.
Напомним, что stderr - это дескриптор файла 2. Мы используем 2> для перенаправления сообщений об ошибках.
Перенаправление стандартного вывода ошибок в файл
Иногда команды выдают сообщения об ошибках, которые вы хотите захватить отдельно от их стандартного вывода.
-
Убедитесь, что вы находитесь в каталоге ~/project.
cd ~/project
[labex@host project]$
-
Давайте попробуем вывести список содержимого несуществующего каталога. Это сгенерирует сообщение об ошибке.
ls non_existent_directory
ls: cannot access 'non_existent_directory': No such file or directory
Вы можете увидеть сообщение об ошибке, напечатанное непосредственно в терминале.
-
Теперь давайте перенаправим это сообщение об ошибке в файл с именем errors.log.
ls non_existent_directory 2> errors.log
На этот раз вы не увидите сообщение об ошибке в своем терминале.
-
Проверьте содержимое errors.log.
cat errors.log
ls: cannot access 'non_existent_directory': No such file or directory
Сообщение об ошибке теперь сохранено в файле.
Отбрасывание стандартного вывода ошибок
Часто вам может понадобиться запустить команду, которая выдает шумные сообщения об ошибках, которые вам не важны. В таких случаях вы можете перенаправить stderr в /dev/null. /dev/null - это специальный файл устройства, который отбрасывает все данные, записанные в него.
-
Попробуйте команду ls с несуществующим каталогом снова, но на этот раз отбросьте ошибку.
ls non_existent_directory 2> /dev/null
Вы не увидите вывода в терминале, и сообщение об ошибке не будет сохранено в файл.
Объединение стандартного вывода и стандартного вывода ошибок
Существуют ситуации, когда вы хотите захватить и stdout, и stderr в один и тот же файл. Это можно сделать несколькими способами.
Метод 1: > file 2>&1
Этот метод перенаправляет stdout в файл, а затем перенаправляет stderr в то же место, что и stdout. Порядок 2>&1 важен: это означает «перенаправить дескриптор файла 2 (stderr) в то же место, что и дескриптор файла 1 (stdout)».
-
Давайте создадим команду, которая выдает как стандартный вывод, так и стандартный вывод ошибок. Мы будем использовать find для поиска файла в каталоге, где у нас есть разрешения, и в каталоге, где у нас их нет.
find ~/project /root -name "current_datetime.txt" > combined_output.log 2>&1
Здесь find ~/project -name "current_datetime.txt" выдаст stdout (если найдено), а find /root -name "current_datetime.txt", вероятно, выдаст stderr из-за проблем с разрешениями.
-
Проверьте файл combined_output.log.
cat combined_output.log
/home/labex/project/current_datetime.txt
find: ‘/root’: Permission denied
Вы можете видеть, что и успешный вывод (путь к файлу), и сообщение об ошибке захватываются в одном и том же файле.
Метод 2: &> file (специфично для Bash)
Bash предоставляет сокращенный способ объединения stdout и stderr в файл: &>. Это эквивалентно > file 2>&1.
-
Давайте попробуем ту же команду find, используя сокращение &>.
find ~/project /root -name "file_list.txt" &> combined_output_shorthand.log
-
Проверьте содержимое combined_output_shorthand.log.
cat combined_output_shorthand.log
/home/labex/project/file_list.txt
find: ‘/root’: Permission denied
Результат такой же, как и в предыдущем методе, демонстрируя удобство &>.
Добавление объединенных потоков
Как и в случае с stdout, вы можете добавлять объединенные stdout и stderr в файл, используя >> file 2>&1 или &>> file.
-
Добавьте больше вывода и ошибок в combined_output.log.
find ~/project /root -name "line_count.txt" >> combined_output.log 2>&1
-
Просмотрите обновленный combined_output.log.
cat combined_output.log
/home/labex/project/current_datetime.txt
find: ‘/root’: Permission denied
/home/labex/project/line_count.txt
find: ‘/root’: Permission denied
Новый вывод и ошибки добавлены к существующему содержимому.
Теперь вы успешно узнали, как перенаправлять стандартный вывод ошибок и как объединять стандартный вывод и стандартный вывод ошибок в один файл. Эти знания необходимы для надежного написания сценариев и задач администрирования системы.