Обычные результаты программы, как правило, записывают в стандартный вывод, а диагностические сообщения — в отдельный стандартный поток ошибок, или stderr. Разделение потоков позволяет сохранять полезные данные, не смешивая их с сообщениями об ошибках.
Text-Fu · Урок 3
stderr (стандартный поток ошибок)
Научитесь перенаправлять стандартный поток ошибок отдельно или объединять его со стандартным выводом в Bash.
Отделение обычного вывода от ошибок
Рассмотрим команду с несуществующим путём:
$ ls /fake/directory > peanuts.txt
ls: cannot access '/fake/directory': No such file or directory
Оператор > перенаправляет только stdout. Диагностическое сообщение записывается в stderr, который всё ещё подключён к терминалу. Тем временем оболочка создаёт или усекает peanuts.txt для stdout, хотя ls не формирует обычного результата.
Стандартные потоки по соглашению используют следующие файловые дескрипторы:
0: stdin (стандартный ввод)1: stdout (стандартный вывод)2: stderr (стандартный поток ошибок)
Почему ошибка от ls /missing > results.txt обычно остаётся в терминале?
Перенаправление stderr с помощью 2>
Чтобы перенаправить stderr, укажите файловый дескриптор 2 перед >:
$ ls /fake/directory 2> errors.txt
Оболочка создаёт или усекает errors.txt и подключает его к дескриптору 2. Stdout сохраняет прежнее назначение. Если вывод ошибок нужно добавить в конец файла, используйте 2>> errors.txt.
Какая команда заменяет errors.log диагностическими сообщениями от find /restricted, оставляя stdout в прежнем назначении?
Объединение stdout и stderr
Чтобы поместить оба выходных потока в один файл, сначала перенаправьте stdout, а затем продублируйте stderr в текущее назначение stdout:
$ ls /fake/directory /etc/passwd > combined.txt 2>&1
Перенаправления обрабатываются слева направо:
> combined.txtподключает stdout к файлу.2>&1подключает stderr туда, куда в этот момент направлен stdout.
Обратный порядок изменяет результат:
$ ls /fake/directory /etc/passwd 2>&1 > regular.txt
Здесь stderr сначала дублирует исходное назначение stdout — терминал. Затем stdout перемещается в regular.txt, поэтому два потока оказываются в разных местах.
Какое перенаправление Bash отправляет и stdout, и stderr команды command в all.log?
Bash также предоставляет &> как сокращённую запись для замены файла обоими потоками:
$ ls /fake/directory /etc/passwd &> combined.txt
Для добавления обоих потоков в Bash используйте &>>. Явную форму > file 2>&1 полезно узнавать, поскольку она также встречается в сценариях оболочки и документации.
Какая команда Bash добавляет и stdout, и stderr команды build в build.log?
Намеренное отбрасывание потока
/dev/null — специальное устройство, отбрасывающее записанные в него данные. Перенаправляйте туда stderr, только если установили, что диагностические сообщения ожидаемы и не нужны:
$ ls /fake/directory 2> /dev/null
Это не заставляет команду завершиться успешно и не изменяет её код выхода, а лишь скрывает диагностический поток. При поиске неисправностей сохраняйте или отображайте stderr, а не отбрасывайте нужную информацию.
Что изменяет check-data 2> /dev/null?
Чтобы попрактиковаться в управлении всеми тремя стандартными потоками, выполните лабораторную работу:
- Перенаправление ввода и вывода в Linux — научитесь перенаправлять ввод и вывод в оболочке Linux, управляя stdout, stderr и stdin с помощью операторов
>,>>,2>и командыtee.
Урок завершён
Вы завершили stderr (стандартный поток ошибок)
Теперь вы можете отделять диагностические сообщения от обычного вывода команды или объединять эти потоки.
Распознавайте stderr как файловый дескриптор 2.
Заменяйте журнал ошибок или добавляйте в него с помощью
2>и2>>.Применяйте несколько перенаправлений слева направо.
Объединяйте оба выходных потока с помощью осознанно выбранного синтаксиса.
Отбрасывайте диагностические сообщения, только если их потеря допустима.
Сохраните прогресс
Создайте бесплатный аккаунт, чтобы сохранить этот урок и продолжить на любом устройстве.
Создать бесплатный аккаунт