覆盖 bash 命令并将其作为参数传递给 xargs

覆盖 bash 命令并将其作为参数传递给 xargs

我希望能够将修改后的 grep 命令传递给 xargs。我正在使用类似于以下的 bash 函数覆盖命令是否可以覆盖命令行内置的“cd”命令?。我的以下函数可以工作,但传递给 xargs 时除外。为什么会出现这种情况?我该如何解决这个问题?

重新定义:

function grepc() { $(which grep) -c "$@"; }

作品:

find -name '*.py' | grepc web
2

xargs 失败:

find -name '*.py' | xargs grepc import
xargs: grepc: No such file or directory

(这里传递给 xargs 应该 grep python 列表的文件内容,这是一个奇怪的人为示例,但重点是 xargs 找不到 grepc)

TLDR:为什么不能| xargs <function>工作?<function>实际上需要是<builtin>或其他什么吗?

答案1

无论xargs运行什么,它都是它的直接子进程,它们之间没有 shell。xargs没有你的函数的概念。它也没有 shell 内置命令的概念。

为了使其工作:

  • 要么导出你的函数(使用export -f grepc)然后xargs以有点麻烦的方式运行 shell:… | xargs bash -c 'grepc "$@"' bash
  • 或者更好地将您的函数转换为脚本,使文件可执行并将其放在您$PATH指向的位置(或调整变量);然后grepc将是一个文件并且xargs能够运行它。

答案2

我想到了一个解决方法:

alias xg='xargs grep --color <or whatever else I want>'

因为我经常使用这个组合。

相关内容