stderr (стандартный поток ошибок)
100%

Text-Fu · Урок 3

stderr (стандартный поток ошибок)

Научитесь перенаправлять стандартный поток ошибок отдельно или объединять его со стандартным выводом в Bash.

Обычные результаты программы, как правило, записывают в стандартный вывод, а диагностические сообщения — в отдельный стандартный поток ошибок, или stderr. Разделение потоков позволяет сохранять полезные данные, не смешивая их с сообщениями об ошибках.

Отделение обычного вывода от ошибок

Рассмотрим команду с несуществующим путём:

$ 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

Перенаправления обрабатываются слева направо:

  1. > combined.txt подключает stdout к файлу.
  2. 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?

Чтобы попрактиковаться в управлении всеми тремя стандартными потоками, выполните лабораторную работу:

  1. Перенаправление ввода и вывода в Linux — научитесь перенаправлять ввод и вывод в оболочке Linux, управляя stdout, stderr и stdin с помощью операторов >, >>, 2> и команды tee.

Урок завершён

Вы завершили stderr (стандартный поток ошибок)

Теперь вы можете отделять диагностические сообщения от обычного вывода команды или объединять эти потоки.

  • Распознавайте stderr как файловый дескриптор 2.

  • Заменяйте журнал ошибок или добавляйте в него с помощью 2> и 2>>.

  • Применяйте несколько перенаправлений слева направо.

  • Объединяйте оба выходных потока с помощью осознанно выбранного синтаксиса.

  • Отбрасывайте диагностические сообщения, только если их потеря допустима.

Сохраните прогресс

Создайте бесплатный аккаунт, чтобы сохранить этот урок и продолжить на любом устройстве.

Создать бесплатный аккаунт
Следующий Урок
Назад к Text-Fu