На этот вопрос уже есть ответ:
При использовании nohup для запуска команды в фоновом режиме часть содержимого появляется в терминале.
cp: error reading ‘/mnt/tt/file.txt’: Input/output error
cp: failed to extend ‘/mnt/tt/file.txt’: Input/output error
Я хочу сохранить этот контент в файл.
Существует два основных потока вывода в Linux (и другие ОС), стандартный вывод (стандартный вывод) и стандартная ошибка (stderr). Сообщения об ошибках, например те, которые вы показываете, печатаются со стандартной ошибкой. Классический оператор перенаправления (command > file
) перенаправляет только стандартный вывод, поэтому стандартная ошибка все еще отображается на терминале. Чтобы перенаправить stderr, у вас есть несколько вариантов:
Перенаправить stdout в один файл и stderr в другой файл:
command > out 2>error
Перенаправить stderr в stdout (&1
), а затем перенаправить stdout в файл:
command >out 2>&1
Переназначить оба файла:
command &> out
Для получения дополнительной информации о различных операторах управления и перенаправления см. Вот,
Прежде всего следует отметить, что существует несколько способов в зависимости от вашей цели и оболочки, поэтому это требует небольшого понимания нескольких аспектов. Наиболее типичным является 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