1

我有 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不被sub'ed

你能让这个 grepall 工作吗?

4

1 回答 1

2

这是因为您正在使用fork 一个新的 shell 进程,sh -c并且父 shell 的所有变量在子 shell 中都不可用,除非您导出它们。

使用此功能使其工作:

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

它现在可以工作了,因为我们正在创建一个导出的变量,该变量p也可以在子 shell 中使用。

由于无论如何您都在分叉一个新的外壳,因此您实际上不需要调用xargsa,因为find可以为您完成这项工作:

grepall () {
   export p="$2"; find . -name $1 -exec sh -c 'echo $1; grep "$p" $1; echo "" ' - {} \;;
}
于 2014-08-28T09:38:24.303 回答