我试图使用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 0
和exit 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/