La exportación de la función debería hacerlo (sin probar):
export -f echo_var
seq -f "n%04g" 1 100 | xargs -n 1 -P 10 -I {} bash -c 'echo_var "$@"' _ {}
Puede usar el incorporado en printf
lugar del externo seq
:
printf "n%04g\n" {1..100} | xargs -n 1 -P 10 -I {} bash -c 'echo_var "$@"' _ {}
Además, el uso return 0
y exit 0
similares oculta cualquier valor de error que pueda generar el comando que lo precede. Además, si no hay error, es el valor predeterminado y, por lo tanto, algo redundante.
@phobic menciona que el comando Bash podría simplificarse para
bash -c 'echo_var "{}"'
moviendo el {}
directamente dentro de él. Pero es vulnerable a la inyección de comandos como lo señaló @Sasha.
Aquí hay un ejemplo de por qué no debe usar el formato incrustado:
$ echo '$(date)' | xargs -I {} bash -c 'echo_var "{}"'
Sun Aug 18 11:56:45 CDT 2019
Otro ejemplo de por qué no :
echo '\"; date\"' | xargs -I {} bash -c 'echo_var "{}"'
Esto es lo que se genera con el formato seguro :
$ echo '$(date)' | xargs -I {} bash -c 'echo_var "$@"' _ {}
$(date)
Esto es comparable al uso de consultas SQL parametrizadas para evitar la inyección .
Estoy usando date
una sustitución de comando o entre comillas escapadas aquí en lugar del rm
comando utilizado en el comentario de Sasha, ya que no es destructivo.