ZaLinux.ru

Как объединить вывод двух и более команд

Рассмотрим две ситуации. Первая — нужно объединить вывод двух или более команд, которые работают одновременно. Вторая — нужно объединить вывод нескольких команд, завершающихся друг после друга.

Команды работают одновременно и выводят информацию в терминал

Можно комбинировать две команды группируя их с помощью символов { } :

{ КОМАНДА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

Рекомендуемые статьи:

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *