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