有没有办法在其他命令结束后附加命令的结果?

时间:2014-08-01 10:34:19

标签: bash shell scripting

大多数SQL数据库系统提供UNION语句来组合两个选择的结果的方式相同,我想从bash中的两个命令输出生成输出流。

一个例子(这只是一个示例,不要将其视为XY problem):我想在"name"文件中查找cpp中的单词grep name $(find /home/whoever/ -name "*.cpp") grep name $(find /mnt/hd -name "*.cpp") 不同的文件夹:

grep name { $(find /mnt/hd -name "*.cpp") UNION $(find /mnt/hd -name "*.cpp") } 

这有两个步骤,但我只想做一个,比如:

{{1}}

修改

正如一些答案所表明的那样,这个例子很容易以更简单的方式处理,但这只是一个例子,我想知道是否有办法创建一个输出流组合(一个接一个是好的)另外两个流。

3 个答案:

答案 0 :(得分:2)

您可以在{2}目录中运行find

find /home/whoever/ /mnt/hd -name "*.cpp" -exec grep "name" '{}' \; -print

要回答关于添加2个命令的评论,然后采用它们的组合输出:

{ find /mnt/hd -name "*.cpp"; find /mnt/hd -name "*.cpp"; } | grep "name"

答案 1 :(得分:2)

只需使用catprocess substitution即可。如,

cat                                                    \
    <(grep name $(find /home/whoever/ -name "*.cpp"))  \
    <(grep name $(find /mnt/hd -name "*.cpp"))

这适用于任意数量的命令。实际上,一般形式是

cat <(list_1) <(list_2) ... <(list_n)

其中每个list_i是一个有效的命令表达式。

但请注意,进程替换是Bash扩展;其他shell(例如,严格遵守POSIX的shell)可能不支持它。

答案 2 :(得分:0)

您可以告诉diff在多个目录中搜索:

find dir1 dir2 ... dirn -name "*.cpp"

<强>更新

组合命令使用花括号“大括号也用于在当前shell上下文中执行一系列命令”

例如

{ command1 ; command2 ; ....; command n} >logfile

#command1 and command 2 can be the same command
{ echo "Hello" ; echo "World" ;} > logfile
#or a combination of different commands
{ date; top -b -n1 | head ; } >logfile