在单个命令中将一个命令的输出附加到另一个命令的输出

时间:2012-02-02 06:41:27

标签: bash unix stdout pipe

有没有办法将一个命令的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 个答案:

答案 0 :(得分:5)

只需将两个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

你可以使用花括号来达到类似的效果,但是花括号有一些语法上的差异(例如,在括号和其他词之间需要空格时,它们更加挑剔)。最大的区别是大括号内的命令在当前 shell环境中运行,因此它们可能会影响您的环境。例如:

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$

答案 1 :(得分:2)

将两个命令分组为大括号并对其进行管道处理:

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

这样就省略了任何文件的创建。

答案 2 :(得分:0)

可能是这样的:

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

答案 3 :(得分:0)

是的,请使用find。根据{{​​1}}手册页,这些选项只查找.py和.js文件

ack-grep

find apps/ media/js -type f -name "*.py" -o -name "*.js" -exec somecommand {} + 的{​​{1}}选项使其与+一样有效,但如果您的文件包含空格或换行符或其他恶意内容,则不会造成可怕的死亡以他们的名义。