的.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
成为子壳也可以。
既然你反正派生一个新的外壳,你并不真的需要调用xargsa
为find
能为你做的工作:
grepall() {
export p="$2"; find . -name $1 -exec sh -c 'echo $1; grep "$p" $1; echo "" ' - {} \;;
}
不错的一个,只是在时间看我的无聊的测试结果 – dmc 2014-08-28 09:46:34
不客气,很高兴它的工作。 – anubhava 2014-08-28 09:48:54
您可能会想要“取消设置p”,以免污染脚本其余部分的环境。或者,用'find查找env赋值。 -name“$ 1”| p =“$ 2”xargs -I%sh -c'echo%; grep“$ p”%; echo''''''''''不要忘记引用''$ 1'' – 2014-08-28 10:52:03