我希望能够将修改后的 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>'
因为我经常使用这个组合。