【问题标题】:How to use xargs with a function in fish shell?如何在fish shell中使用带有函数的xargs?
【发布时间】:2018-11-21 05:18:57
【问题描述】:

我需要使用 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 $@' _

【问题讨论】:

    标签: function fish


    【解决方案1】:

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

    #!/bin/fish
    
    function func
        echo $argv
    end
    
    func $argv
    

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

    【讨论】:

    • 它对 bash 进行了一些修改。就像在这个答案中一样:stackoverflow.com/questions/11003418/…有没有办法在鱼中做类似的事情?
    • bash export -f some_func 功能在我看来是个伪命题。之所以使用 shell 函数,是因为它可以修改当前 shell 的状态。以这种方式导出函数使得这是不可能的。因此具有误导性和愚蠢性,因为您可以使用我的解决方案达到相同的效果。
    • 我知道我可以将 then 放在单独的脚本中,但我这里有很多函数,我不想为了组织问题将它们中的每一个都放在单独的脚本中。
    • 再次阅读我的答案,@SérgioMucciaccia。它仅在 bash 中起作用,因为 bash 具有反特性(即,不应该实现的东西)。 shell 函数的一个主要特点是它们可以修改 shell 的状态。 export -f some_func 特性,根据定义,意味着some_func 不能修改当前shell 的状态。在这种情况下,您应该将其作为脚本实现。因为这就是在后台发生的事情。
    【解决方案2】:

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

    完全不使用 xargs 可能对您更有效。

    代替

    echo 'example' | xargs func
    

    只需运行func example

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

    所以不是

    somecommand | xargs func
    

    使用

    func (somecommand)
    

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

    【讨论】:

    • 我想使用 xargs 因为 -n1 选项,所以我可以并行调用一个函数多次。 xargs 还有另一个有用的选项。有没有办法像命令一样调用函数,创建新进程?
    • 没有。您必须直接调用 fish -c 而不是该函数。这也是您使用 bash 所做的事情,除了 fish 无法“导出”函数,因此它需要全局可用(例如通过自动加载)或 sourced 明确。
    • 看来我无法通过fish -c 传递参数。例如 sh -c 'cat $0' 'a.txt' 有效,参数 a.txt 被传递给 cat,但 fish -c 'cat $argv' 'a.txt' 无效。如何将动态参数传递给fish -c 命令?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多