我试图使用xargs并行调用更复杂的函数。

#!/bin/bash
echo_var(){
    echo $1
    return 0
}
seq -f "n%04g" 1 100 |xargs -n 1 -P 10 -i echo_var {}
exit 0

这将返回错误
xargs: echo_var: No such file or directory

关于如何使用xargs来实现这一点的任何想法,或者任何其他解决方案都是受欢迎的。

最佳答案

导出函数应执行此操作(未测试):

export -f echo_var
seq -f "n%04g" 1 100 | xargs -n 1 -P 10 -I {} bash -c 'echo_var "$@"' _ {}

您可以使用内置printf而不是外部seq
printf "n%04g\n" {1..100} | xargs -n 1 -P 10 -I {} bash -c 'echo_var "$@"' _ {}

另外,像这样使用return 0exit 0会屏蔽前面的命令可能产生的任何错误值。另外,如果没有错误,这是默认的,因此有些多余。
@恐惧症提到Bash命令可以简化为
bash -c 'echo_var "{}"'

{}直接移到里面。但正如@Sasha所指出的,它很容易被命令注入。
下面是一个不应使用嵌入式格式的示例:
$ echo '$(date)' | xargs -I {} bash -c 'echo_var "{}"'
Sun Aug 18 11:56:45 CDT 2019

另一个为什么不:
echo '\"; date\"' | xargs -I {} bash -c 'echo_var "{}"'

这是使用安全格式输出的内容:
$ echo '$(date)' | xargs -I {} bash -c 'echo_var "$@"' _ {}
$(date)

这相当于使用parameterizedSQLqueries来避免injection
我在命令替换或转义引号中使用了date而不是Sasha注释中使用的rm命令,因为它是非破坏性的。

关于bash - 用xargs调用shell函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31735780/

10-11 07:01