Рассмотрим две ситуации. Первая — нужно объединить вывод двух или более команд, которые работают одновременно. Вторая — нужно объединить вывод нескольких команд, завершающихся друг после друга.
Команды работают одновременно и выводят информацию в терминал
Можно комбинировать две команды группируя их с помощью символов { } :
{ КОМАНДА1 & КОМАНДА2; }
Вывод команд можно перенаправлять в файл. Обратите внимание, что последняя точка с запятой перед последней фигурной скобкой являются обязательными, также является обязательным пробел между открывающей и закрывающей фигурной скобкой:
{ КОМАНДА1 & КОМАНДА2; } > НОВЫЙ_ФАЙЛ
Если вы хотите разделить STDOUT (стандартный вывод) и STDERR (стандартный вывод ошибок) по двум файлам:
{ КОМАНДА1 & КОМАНДА2; } > STDOUT_file 2> STDERR_file
Данная конструкция работает, в том числе, и более чем для двух команд. Помните, что Ctrl+с закроет только одну из команд, поскольку остальные будут запущены в фоне — их нужно закрыть вручную.
В более общем смысле можно использовать либо подоболочку, либо группирование команд и перенаправить вывод всей группы сразу.
Ещё один вариант использования сабшелла или группировки команд и перенаправления вывода всей группы за раз:
( КОМАНДА1 ; КОМАНДА2 ; КОМАНДА3 ) | cat { КОМАНДА1 ; КОМАНДА2 ; КОМАНДА3 ; } > outfile.txt
Основное различие между ними состоит в том, что первый разделяет дочерний процесс, а второй работает в контексте основной оболочки. Это может иметь последствия в отношении настройки и использования переменных и других параметров среды, а также производительности.
Не забывайте, что закрывающая скобка в группировании команд (и функций) должна быть отделена от содержимого точкой с запятой или новой строкой.
Последовательное выполнение команд и объединение вывода
Данный код походит на первый пример:
{ КОМАНДА1 && КОМАНДА2; }
Он различается только тем, что вместо одного амперсанда используется два подряд. Но это имеет огромное различие для оболочки! Поскольку если указан один амперсанд, то он просто переводит команду в фон и запускает следующую. Если указано два амперсанда подряд, то вначале выполняется первая команда и если она завершена без ошибок, то только в этом случае начинает выполняться вторая команда.
Это больше всего подходит, например, для объединения файлов, которые необходимо открыть разными программами. Например:
( zcat access_log.*gz && cat access_log ) > biglog.txt
Связанные статьи:
- Как извлечь часть строки в Bash (100%)
- Как создавать диалоговые блоки в интерактивных shell скриптах (65.6%)
- Как в Bash реализовать «Нажмите любую кнопку для продолжения» (65.6%)
- Как в Bash проверить, содержит ли строка подстроку (65.6%)
- Что такое башизм (bashisms) (65.6%)
- Как пользоваться screen для управления терминалами Linux и отсоединения процессов от терминала (RANDOM - 34.5%)