.bashrc函数实现grepall

时间:2014-08-28 09:30:47

标签: bash unix grep .bash-profile bash-function

我有2个bash函数catall和grepall

catall工作正常,首先捕获所有找到的文件,然后是内容和新行

catall ()
{
  find . -name $1 | xargs -I % sh -c 'echo %; cat %; echo"" '
}


grepall ()
{
  find . -name $1 | xargs -I % sh -c 'echo %; cat % | grep $2; echo"" '
}

但是grepall不起作用,应该与catall相同,但在文件内容上有一个grep阶段

为什么$2没有加入

你可以让这个grepall工作吗?

1 个答案:

答案 0 :(得分:2)

这是因为你使用sh -c分配一个新的shell进程,除了导出他们之外,所有父shell的变量都不在子shell中。

使用此功能使其正常工作:

grepall () {
   export p="$2"; find . -name $1 | xargs -I % sh -c 'echo %; grep "$p" %; echo "" ';
}

它现在有效,因为我们正在创建一个导出变量p,它也可以在子shell中使用。

因为你要求新的shell,所以你真的不需要致电xargsa,因为find可以为你完成这项工作:

grepall () {
   export p="$2"; find . -name $1 -exec sh -c 'echo $1; grep "$p" $1; echo "" ' - {} \;;
}