При перенаправлении вывода команды в файл или передаче его по конвейеру другой команде вы можете заметить, что сообщения об ошибках выводятся на экран.
В Bash и других оболочках Linux при выполнении программы используются три стандартных потока ввода-вывода. Каждый поток представлен числовым дескриптором файла:
0
—stdin
, стандартный поток ввода.-
1
—stdout
, стандартный поток вывода. -
2
—stderr
, стандартный поток ошибок.
Дескриптор файла — это просто число, представляющее открытый файл.
Входной поток предоставляет информацию программе, как правило, путем ввода с клавиатуры.
Выходные данные программы попадают в стандартный поток ввода, а сообщения об ошибках — в стандартный поток ошибок. По умолчанию на экран выводятся потоки ввода и ошибки.
Содержание
Перенаправление вывода
Перенаправление — это способ захватить вывод программы и отправить его в качестве ввода в другую программу или файл.
Потоки могут быть перенаправлены с помощью оператора 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
или &>
.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.