大多数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}}
修改
正如一些答案所表明的那样,这个例子很容易以更简单的方式处理,但这只是一个例子,我想知道是否有办法创建一个输出流组合(一个接一个是好的)另外两个流。
答案 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)
只需使用cat
加process 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