bash - xargs grep
Llamar a funciones de shell con xargs (4)
Algo así debería funcionar también:
function testing() { sleep $1 ; }
echo {1..10} | xargs -n 1 | xargs -I@ -P4 bash -c "$(declare -f testing) ; testing @ ; echo @ "
Estoy tratando de usar xargs para llamar a una función más compleja en paralelo.
#!/bin/bash
echo_var(){
echo $1
return 0
}
seq -f "n%04g" 1 100 |xargs -n 1 -P 10 -i echo_var {}
exit 0
Esto devuelve el error
xargs: echo_var: No such file or directory
Cualquier idea sobre cómo puedo usar xargs para lograr esto, o cualquier otra solución sería bienvenida.
El uso de GNU Parallel se ve así:
#!/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
Si usa la versión 20170822, ni siquiera tiene que export -f
, siempre y cuando haya ejecutado esto:
. `which env_parallel.bash`
seq -f "n%04g" 1 100 | env_parallel -P 10 echo_var {}
La exportación de la función debería hacerlo (no probado):
export -f echo_var
seq -f "n%04g" 1 100 | xargs -n 1 -P 10 -I {} bash -c ''echo_var "$@"'' _ {}
Puede usar el printf
incorporado en lugar del seq
externo:
printf "n%04g/n" {1..100} | xargs -n 1 -P 10 -I {} bash -c ''echo_var "$@"'' _ {}
Además, el uso de return 0
y exit 0
like enmascara cualquier valor de error que pueda producir el comando que lo precede. Además, si no hay ningún error, es el predeterminado y por lo tanto algo redundante.
Tal vez esta sea una mala práctica, pero si define funciones en un .bashrc
u otro script, puede envolver el archivo o al menos las definiciones de función con una configuración de allexport
:
set -o allexport
function funcy_town {
echo ''this is a function''
}
function func_rock {
echo ''this is a function, but different''
}
function cyber_func {
echo ''this function does important things''
}
function the_man_from_funcle {
echo ''not gonna lie''
}
function funcle_wiggly {
echo ''at this point I/'m doing it for the funny names''
}
function extreme_function {
echo ''goodbye''
}
set +o allexport