我有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工作吗?
答案 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 "" ' - {} \;;
}