При перенаправлении вывода команды в файл или передачи его в другую команду вы можете заметить, что сообщения об ошибках выводятся на экран.
В Bash и других оболочках Linux, когда программа выполняется, она использует три стандартных потока ввода-вывода. Каждый поток представлен числовым дескриптором файла:
Файловый дескриптор – это просто число, представляющее открытый файл.
Поток ввода предоставляет информацию программе, как правило, набирая на клавиатуре.
Вывод программы поступает в стандартный поток ввода, а сообщения об ошибках – в стандартный поток ошибок. По умолчанию потоки ввода и ошибки выводятся на экран.
Перенаправление – это способ захвата вывода из программы и отправки его в качестве ввода в другую программу или файл.
Потоки могут быть перенаправлены с помощью n>оператора, где nуказан номер дескриптора файла.
Если n опущено, по умолчанию 1 используется как стандартный поток вывода. Например, следующие две команды одинаковы; оба перенаправят команду output ( 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 и есть сообщения об ошибках, отправленных в тот же файл, как стандартный вывод, используйте следующее:
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 или &>.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.