Вопрос Как перенаправить stderr в файл [duplicate]


На этот вопрос уже есть ответ:

При использовании nohup для запуска команды в фоновом режиме часть содержимого появляется в терминале.

cp: error reading ‘/mnt/tt/file.txt’: Input/output error
cp: failed to extend ‘/mnt/tt/file.txt’: Input/output error

Я хочу сохранить этот контент в файл.


163
2018-05-18 12:31


происхождения




ответы:


Существует два основных потока вывода в Linux (и другие ОС), стандартный вывод (стандартный вывод) и стандартная ошибка (stderr). Сообщения об ошибках, например те, которые вы показываете, печатаются со стандартной ошибкой. Классический оператор перенаправления (command > file) перенаправляет только стандартный вывод, поэтому стандартная ошибка все еще отображается на терминале. Чтобы перенаправить stderr, у вас есть несколько вариантов:

  1. Перенаправить stdout в один файл и stderr в другой файл:

    command > out 2>error
    
  2. Перенаправить stderr в stdout (&1), а затем перенаправить stdout в файл:

    command >out 2>&1
    
  3. Переназначить оба файла:

    command &> out
    

Для получения дополнительной информации о различных операторах управления и перенаправления см. Вот,


265
2018-05-18 12:50



Так hashdeep -rXvvl -j 30 -k checksums.txt /mnt/app/ >> result_hashdeep.txt 2> error_hashdeep.txt & или hashdeep -rXvvl -j 30 -k checksums.txt /mnt/app/ >> result_hashdeep.txt 2>&1 или hashdeep -rXvvl -j 30 -k checksums.txt /mnt/app/ &> result_mixed.txt - André M. Faria
@ AndréM.Faria да. Но последние две команды эквивалентны, они будут отправлять как ошибку, так и вывод в тот же файл. - terdon♦
Как и в приведенной ссылке, я мог бы использовать | & вместо 2> & 1, они эквивалентны, спасибо за ваше время. - André M. Faria
Привет, я смог упростить это: command 2> out, - Surya Teja Karra
@SuryaTejaKarra, который перенаправляет только stderr, но не stdout. - terdon♦


Прежде всего следует отметить, что существует несколько способов в зависимости от вашей цели и оболочки, поэтому это требует небольшого понимания нескольких аспектов. Наиболее типичным является 2> в Борн-подобные снаряды, такие как dash (который символически связан с /bin/sh) а также bash; сначала это стандартная и POSIX-совместимая оболочка, а другая - то, что большинство пользователей используют для интерактивного сеанса. Они отличаются синтаксисом и функциями, но, к счастью, перенаправление потока ошибок работает одинаково (кроме &> нестандартный). В случае csh и его производных перенаправление stderr там не работает.

Вернемся к 2> часть. Два ключевых момента: > означает оператор перенаправления, где мы открываем файл и 2 integer обозначает дескриптор файла stderr; на самом деле это именно то, как стандарт POSIX для языка оболочки определяет перенаправление в раздел 2.7:

[n]redir-op word

Для простых > перенаправление, 1 целое подразумевается для stdout, т.е. echo Hello World > /dev/null это то же самое, что и echo Hello World 1>/dev/null, Обратите внимание, что оператор integer или redirection не может быть процитирован, иначе оболочка не распознает их как таковой и вместо этого рассматривает как литеральную строку текста. Что касается интервала, важно, чтобы целое число было рядом с оператором перенаправления, но файл может быть либо рядом с оператором перенаправления, либо нет, т. Е. command 2>/dev/null а также command 2> /dev/null будет работать нормально.

Несколько упрощенный синтаксис для типичной команды в shell будет

 command [arg1] [arg2]  2> /dev/null

Трюк здесь заключается в том, что перенаправление может появляться в любом месте. Это и то, и другое 2> command [arg1] а также command 2> [arg1] действительны. Заметим, что для bash оболочка, там существует &> способ перенаправления потоков stdout и stderr в одно и то же время, но опять же - это специфичный для bash, и если вы стремитесь к переносимости скриптов, это может не сработать. Смотрите также Ubuntu Wiki а также В чем разница между &> и 2> & 1,

Заметка:  > оператор перенаправления усекаетфайл и перезаписывает его, если файл существует. 2>> может использоваться для добавления stderr в файл.

Если вы заметите, > предназначен для одной команды. Для скриптов мы можем перенаправить поток stderr всего скрипта извне, как в myscript.sh 2> /dev/null или мы можем использовать встроенный, Встроенный модуль exec имеет возможность перепрограммировать поток для всего сеанса оболочки, так сказать, интерактивно или через скрипт. Что-то вроде

#!/bin/sh
exec 2> ./my_log_file.txt
stat /etc/non_existing_file

В этом примере файл журнала должен показывать stat: cannot stat '/etc/non_existing_file': No such file or directory,

Еще один способ - через функции. В виде kopciuszek отметил в своем ответе, мы можем написать объявление функции с уже прикрепленным перенаправлением, то есть

some_function(){
    command1
    command2
} 2> my_log_file.txt

5
2018-05-03 07:48