Я хотел бы запустить несколько команд и захватить весь вывод в файл журнала. Я также хочу напечатать любые ошибки на экране (или, возможно, отправить кому-то сообщение).
Вот пример. Следующая команда будет запускать три команды и будет записывать весь вывод (STDOUT и STDERR) в один файл журнала.
{ command1 && command2 && command3 ; } > logfile.log 2>&1
Вот что я хочу сделать с выходом этих команд:
- STDERR и STDOUT для всех команд отправляются в файл журнала, в случае, если он мне понадобится позже. Обычно я не буду смотреть здесь, если не возникнут проблемы.
- Распечатайте STDERR на экран (или, необязательно, на канал /bin/mail ), чтобы какая-либо ошибка выделялась и не игнорируется.
-
Было бы неплохо, если бы коды возврата были еще пригодны для использования, чтобы я мог выполнять обработку ошибок. Возможно, я хочу отправить электронное сообщение, если произошла ошибка, например:
{command1 && command2 && command3; } > logfile.log 2 > & 1 || mailx -s "Произошла ошибка" [email protected]
Проблема, с которой я сталкиваюсь, заключается в том, что STDERR теряет контекст во время перенаправления ввода-вывода. A '2 > & 1' преобразует STDERR в STDOUT, и поэтому я не могу просматривать ошибки, если я делаю 2 > error.log
Вот несколько более сочных примеров. Предположим, что я запускаю некоторые знакомые команды сборки, но я не хочу, чтобы вся сборка остановилась только из-за одной ошибки, поэтому я использую флаг "-keep-going".
{ ./configure && make --keep-going && make install ; } > build.log 2>&1
Или здесь простая (и, возможно, неаккуратная) сборка и развертывание script, которая будет продолжаться в случае ошибки.
{ ./configure && make --keep-going && make install && rsync -av --keep-going /foo devhost:/foo} > build-and-deploy.log 2>&1
Я думаю, что я хочу использовать Bash Перенаправление ввода/вывода, но я не могу понять это.