在bash脚本中用xargs调用函数

我正在尝试使用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来完成这个任何想法,或任何其他解决scheme将是受欢迎的。 谢谢!

导出函数应该做(未经testing):

 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就像掩盖了可能由前面的命令产生的任何错误值。 另外,如果没有错误,这是默认的,因此有点多余。

使用GNU并行看起来像这样:

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

如果你使用的版本是20140822,你甚至不需要export -f ,只要你运行了这个(例如在你的.bashrc中):

 env_parallel() { export parallel_bash_environment='() { '"$(echo "shopt -s expand_aliases 2>/dev/null"; alias;typeset -p | grep -vFf <(readonly; echo GROUPS; echo FUNCNAME; echo DIRSTACK; echo _; echo PIPESTATUS; echo USERNAME) | grep -v BASH_;typeset -f)"' }' # Run as: env_parallel parallel_bash_environment "2>/dev/null;" ... `which parallel` "$@" unset parallel_bash_environment } seq -f "n%04g" 1 100 | env_parallel -P 10 echo_var {} 

注意:由于Shellshock的解决scheme,如果您升级Bash以修复Shellshock,则以上版本不适用于版本<= 20140922。 您将需要升级GNU并行。 宇宙对造成的不便深表歉意。

像这样的东西也应该工作:

 function testing() { sleep $1 ; } echo {1..10} | xargs -n 1 | xargs -I@ -P4 bash -c "$(declare -f testing) ; testing @ ; echo @ "