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