如何将 zsh 的 zargs 与命令列表一起使用?

How can I use zsh's zargs with list of commands?

如何使用 zsh 的 zargs 命令列表?我知道使用 sh -c 之类的东西,但似乎 zsh 可以做一些更有效率的事情。

我想也许是一个匿名函数,例如:

zargs -I arg -- **/*.git -- function { cd /.. ; git log -1 --format=%cd } arg

但我明白了

zsh: parse error near `}'

注意:我也知道我可以用

解决这个例子
zargs -I arg -- **/.git -- git -C arg/.. log -1 --format=%cd

但我正在寻找更通用的解决方案。

zargs 只是一个 shell 函数,它只能接受参数,它不是 shell 语法中的关键字,如 for/while...

这里,你不妨使用一个循环:

for dir (**/.git(N/)) (cd -- $dir:h && git log -1 --format=%cd)

对于 zargs,您可以使用您预先定义的函数:

log() (
  cd -- :h && git log -1 --format=%cd
)
zargs -I arg -- **/.git(/) -- log arg

如果您想以通用方式内联代码,您可以定义一个助手,例如:

run() eval "shift; "
zargs -I arg -- **/.git(/) -- run '(cd -- :h && git log -1 --format=%cd)' arg

zargs 对于分解长参数列表以避免 execve() 的“arg 列表太长”限制很有用,但是对于像 -I arg 这样的用法,我发现它与 for 循环相比没有什么优势。