Добавить вывод одной команды к выводу другой в одной команде - PullRequest
2 голосов
/ 02 февраля 2012

Есть ли способ добавить вывод stdout одной команды к другой и передать объединенный вывод другой команде?Я использовал следующий подход (взяв ack-grep в качестве примера)

# List all python, js files in different directories
ack-grep -f --py apps/ > temp
ack-grep -f --js -f media/js >> temp
cat temp | xargs somecommand

Есть ли способ сделать это в одной команде?

Ответы [ 4 ]

5 голосов
/ 02 февраля 2012

Просто запустите две команды ack-grep как составную команду;затем передайте результаты команды compund.Первая составная команда, определенная в man bash - это круглые скобки:

   (list) list is executed in a subshell environment (see  COMMAND  EXECU-
              TION  ENVIRONMENT below).  Variable assignments and builtin com-
              mands that affect the  shell's  environment  do  not  remain  in
              effect  after  the  command completes.  The return status is the
              exit status of list.

Итак:

james@bodacious-wired:tmp$echo one > one.txt
james@bodacious-wired:tmp$echo two > two.txt
james@bodacious-wired:tmp$(cat one.txt; cat two.txt) | xargs echo
one two

Вы можете использовать фигурные скобки для аналогичного эффекта, но фигурные скобки имеют несколько синтаксических различий(например, они более привередливы в необходимости пробелов между фигурной скобкой и другими словами).Самое большое отличие состоит в том, что команды внутри фигурных скобок выполняются в текущей оболочке, поэтому они могут влиять на вашу среду.Например:

james@bodacious-wired:tmp$HELLO=world; (HELLO=MyFriend); echo $HELLO
world
james@bodacious-wired:tmp$HELLO=world; { HELLO=MyFriend; }; echo $HELLO
MyFriend

Если вы хотите по-настоящему придумать, вы можете определить функцию и выполнить ее:

james@bodacious-wired:tmp$myfunc () (
> cat one.txt
> cat two.txt
> )
james@bodacious-wired:tmp$myfunc | xargs echo
one two
james@bodacious-wired:tmp$
2 голосов
/ 02 февраля 2012

Сгруппируйте две команды в фигурные скобки и передайте их по конвейеру:

{ ack-grep -f --py apps/; ack-grep -f --js -f media/js; } | xargs somecommand

Таким образом, вы пропускаете создание любых файлов.

0 голосов
/ 02 февраля 2012

Да, используйте find.Согласно справочной странице ack-grep, эти опции просто ищут файлы .py и .js

find apps/ media/js -type f -name "*.py" -o -name "*.js" -exec somecommand {} +

Опция + для -exec делает его работающим так же, как xargs, но с тем преимуществом, чтоэто не умрет ужасной смертью, если у вас есть файлы с пробелами, символами новой строки или другими гадостями в их имени.

0 голосов
/ 02 февраля 2012

Может быть что-то вроде этого:

ack-grep -f --py apps/ > temp && ack-grep -f --js -f media/js >> temp && cat temp | xargs somecommand
...