При перенаправлении вывода команды в файл или передаче его по конвейеру другой команде вы можете заметить, что сообщения об ошибках выводятся на экран.
В 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 или &> .
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.