我想构建一个自定义的内置函数bash
——例如time
。这可能吗?如果不是的话,可以在另一个shell中吗?
例如,我想这样做:map find -name '*.js' | xargs grep func1
并让它find -name '*.js' | xargs grep func1
在 CWD 中的每个目录中运行。请注意,一切包括管道被传递到map
.
目标是跨多个目录应用命令。我写了一个名为which的脚本,map
它涵盖eval
了$1
所有ls
产生的内容。但是,如果我要运行的命令包括管道、重定向等,那么我必须引用字符串内的所有内容。我正在寻找一种不必这样做的方法。
另外,我只是很好奇这是否可能;)
答案1
ATT ksh、bash 和 zsh 都有一个动态模块加载系统,允许将附加代码加载到现有的 shell 实例中,并且动态加载的代码可以实现新的内置函数。不过,您所要求的不仅仅是一个新的内置函数:它需要新的语法,而且我认为没有一个 shell 可以处理这个问题。您必须修改 shell 源代码中的解析器。
在 zsh 中,您可以接近您想要的语法:
for x (*/) (cd $x && pipeline)
您可以创建别名alias map='for x (*/) (cd $x &&'
,但末尾仍需要右括号。你可以通过粗暴的 hack 获得你想要的语法:
alias map='map__PWD=$PWD; for x (./*/ "") cd $map__PWD${x#.}/ && [[ -z $x ]] || '
这是如此丑陋、脆弱和不可概括的,我不打算解释它。如果您不完全了解它的工作原理,请不要考虑使用它。
答案2
在这种情况下,类似
find . -type f -name "*.js" -exec grep -qF "func1" {} \; -print
可能足以找到*.js
当前目录中或当前目录下包含字符串的文件的名称func1
。
如果您想避免当前目录中的文件:
find . -mindepth 2 -type f -name "*.js" -exec grep -qF "func1" {} \; -print
使用-mindepth 2
,find
不会匹配“深度 1”(即当前目录中)的任何内容。
最后一件事基本上满足了您的要求。它有效地grep
在当前目录的每个子目录中运行。