Как перенаправить stderr на stdout в Bash

При перенаправлении вывода команды в файл или передаче его по конвейеру другой команде вы можете заметить, что сообщения об ошибках выводятся на экран.

В Bash и других оболочках Linux при выполнении программы используются три стандартных потока ввода-вывода. Каждый поток представлен числовым дескриптором файла:

  • 0stdin , стандартный поток ввода.
  • 1stdout , стандартный поток вывода.
  • 2stderr , стандартный поток ошибок.

Дескриптор файла — это просто число, представляющее открытый файл.

Входной поток предоставляет информацию программе, как правило, путем ввода с клавиатуры.

Выходные данные программы попадают в стандартный поток ввода, а сообщения об ошибках — в стандартный поток ошибок. По умолчанию на экран выводятся потоки ввода и ошибки.

Перенаправление вывода

Перенаправление — это способ захватить вывод программы и отправить его в качестве ввода в другую программу или файл.

Потоки могут быть перенаправлены с помощью оператора n> , где n — номер дескриптора файла.

Если n опущено, по умолчанию используется 1 , стандартный выходной поток. Например, следующие две команды одинаковы; оба будут перенаправлять вывод команды ( stdout ) в файл.

command > file
command 1> file

Чтобы перенаправить стандартную ошибку ( stderr ), используйте оператор 2> :

command 2> file

Вы можете записать как stderr и stdout в два отдельных файла:

command 2> error.txt 1> output.txt

Чтобы сообщения об ошибках не отображались на экране, перенаправьте stderr на /dev/null :

command 2> /dev/null

Перенаправление stderr на stdout

При сохранении вывода программы в файл довольно часто перенаправляют stderr на stdout чтобы у вас было все в одном файле.

Чтобы перенаправить stderr на stdout и отправлять сообщения об ошибках в тот же файл, что и стандартный вывод, используйте следующее:

command > file 2>&1

> file перенаправляет stdout в file , а 2>&1 перенаправляет stderr в текущее расположение stdout .

Порядок перенаправления важен. Например, в следующем примере в file перенаправляется только стандартный stdout . Это происходит потому, что стандартный stderr перенаправляется на стандартный stdout до того, как стандартный stdout был перенаправлен в file .

command 2>&1 > file 

Другой способ перенаправить stderr на stdout — использовать конструкцию &> . В Bash &> имеет то же значение, что и 2>&1 :

command &> file

Выводы

Понимание концепции перенаправлений и файловых дескрипторов очень важно при работе в командной строке.

Чтобы перенаправить stderr и stdout , используйте конструкции 2>&1 или &> .

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

Оставьте комментарий