的.bashrc功能实现grepall

问题描述:

我有2个Bash函数catall和grepall的.bashrc功能实现grepall

catall工作正常,catting每个文件它首先打印的文件名,然后在内容和新线发现

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工作吗?

这是因为您使用sh -c派生一个新的外壳工艺和母贝的所有变量都无法在子shell,除非你出口他们。

使用此功能,使其工作:

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

它现在,因为我们正在创建一个导出变量p成为子壳也可以。

既然你反正派生一个新的外壳,你并不真的需要调用xargsafind能为你做的工作:

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

不错的一个,只是在时间看我的无聊的测试结果 – dmc 2014-08-28 09:46:34

+0

不客气,很高兴它的工作。 – anubhava 2014-08-28 09:48:54

+0

您可能会想要“取消设置p”,以免污染脚本其余部分的环境。或者,用'find查找env赋值。 -name“$ 1”| p =“$ 2”xargs -I%sh -c'echo%; grep“$ p”%; echo''''''''''不要忘记引用''$ 1'' – 2014-08-28 10:52:03