如何将 xargs 与鱼壳中的函数一起使用?

Sér*_*cia 4 function fish

我需要使用 xargs 在鱼壳中并行调用一个函数。我试过这个:

#!/bin/fish

function func
    echo $argv
end

echo 'example1' 'example2' | xargs -n1 func
Run Code Online (Sandbox Code Playgroud)

但我得到了这个:

xargs: func: No such file or directory
Run Code Online (Sandbox Code Playgroud)

那么,我怎样才能让它发挥作用呢?

使用 bash 这有效:

#!/bin/bash

function func {
    echo $1
}
export -f func

echo 'example1' 'example2' | xargs -n1  bash -c 'func $@' _
Run Code Online (Sandbox Code Playgroud)

Kur*_*der 6

xargs命令需要外部命令。你不能给它一个函数。您尝试执行的操作不适用于 bash、zsh、ksh 或任何类似的 shell。执行此操作的方法是将函数放入名为func的文件中,该文件位于您的PATH:

#!/bin/fish

function func
    echo $argv
end

func $argv
Run Code Online (Sandbox Code Playgroud)

现在它已作为外部命令(shell 脚本)实现,您可以将其与 xargs: 一起使用echo 'example' | xargs func


fah*_*aho 6

就像 Kurtis 所说, xargs 不适用于函数。它可以通过启动另一个 shell 来工作,但这是一个黑客。

可能对您更好的方法是根本不使用 xargs。

代替

echo 'example' | xargs func
Run Code Online (Sandbox Code Playgroud)

就跑func example

通常,应该为此使用fish 的命令替换。

所以代替

somecommand | xargs func
Run Code Online (Sandbox Code Playgroud)

func (somecommand)
Run Code Online (Sandbox Code Playgroud)

这将somecommand在换行符上拆分s 输出,严格来说比(默认情况下将在“空白”和换行符上拆分,但它允许类似 shell 的引用和转义)严格xargs,这通常是您想要的。