bash 自定义内置

bash 自定义内置

我想构建一个自定义的内置函数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在当前目录的每个子目录中运行。

相关内容