有没有办法将一个命令的stdout输出附加到另一个命令的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
有没有办法在一个命令中完成这个任务?
最佳答案
只需将两个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$
关于bash - 在单个命令中将一个命令的输出追加到另一个命令的输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9108181/