Function 如何在fish shell中使用带有函数的xargs?

Function 如何在fish shell中使用带有函数的xargs?,function,fish,Function,Fish,我需要使用xargs在fish shell中并行调用函数。我试过这个: #!/bin/fish function func echo $argv end echo 'example1' 'example2' | xargs -n1 func 但我明白了: xargs: func: No such file or directory 那么,我怎样才能让它工作呢 使用bash,这一点起到了作用: #!/bin/bash function func { echo $1 } e

我需要使用xargs在fish shell中并行调用函数。我试过这个:

#!/bin/fish

function func
    echo $argv
end

echo 'example1' 'example2' | xargs -n1 func
但我明白了:

xargs: func: No such file or directory
那么,我怎样才能让它工作呢

使用bash,这一点起到了作用:

#!/bin/bash

function func {
    echo $1
}
export -f func

echo 'example1' 'example2' | xargs -n1  bash -c 'func $@' _

xargs
命令需要和外部命令。你不能给它一个函数。您正在尝试的操作无法与bash、zsh、ksh或任何类似的shell一起使用。方法是将函数放入名为func的文件中,该文件位于
路径中

#!/bin/fish

function func
    echo $argv
end

func $argv

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

正如Kurtis所说,xargs不能与函数一起使用。它可以通过发射另一个炮弹来工作,但这是一种黑客行为

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

而不是

echo 'example' | xargs func
只需运行
func示例

一般来说,应该使用fish的命令替换

所以不是

somecommand | xargs func
使用


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

它在bash上进行了一些修改。就像这样的回答:在fish中没有类似的方法吗?在我看来,bash
export-f some_func
特性是一个错误。使用shell函数的原因是它可以修改当前shell的状态。以这种方式导出函数使得这不可能。我知道我可以把它们放在不同的脚本中,但我这里有很多函数,为了组织的问题,我不想把它们放在不同的脚本中。请再次阅读我的答案,@SérgioMucciaccia。它在bash中工作只是因为bash有一个反特性(即,一些永远不应该实现的特性)。shell函数的一个要点是,它们可以修改shell的状态。根据定义,
export-f some_func
功能意味着
some_func
无法修改当前shell的状态。在这种情况下,您应该将其作为脚本实现。因为这就是在后台发生的事情。我想使用xargs,因为-n1选项,所以我可以并行多次调用函数。在xargs上还有其他有用的选项。没有办法像命令一样调用函数,创建一个新进程吗?没有。你必须调用
fish-c
,而不是直接调用函数。这也是您使用bash所做的,只是fish无法“导出”函数,因此它需要全局可用(例如通过自动加载)或显式地
源代码
d。似乎我无法通过
fish-c
传递参数。例如
sh-c'cat$0''a.txt'
起作用,参数a.txt被传递给cat,但是
fish-c'cat$argv''a.txt'
不起作用。如何将动态参数传递给
fish-c
命令?
func (somecommand)