我需要使用 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)
该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。
就像 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,这通常是您想要的。