A exportação da função deve fazê-lo (não testado):
export -f echo_var
seq -f "n%04g" 1 100 | xargs -n 1 -P 10 -I {} bash -c 'echo_var "$@"' _ {}
Você pode usar o builtin em printf
vez do externo seq
:
printf "n%04g\n" {1..100} | xargs -n 1 -P 10 -I {} bash -c 'echo_var "$@"' _ {}
Além disso, usar return 0
e exit 0
assim mascara qualquer valor de erro que possa ser produzido pelo comando que o precede. Além disso, se não houver erro, é o padrão e, portanto, um pouco redundante.
@phobic menciona que o comando Bash poderia ser simplificado para
bash -c 'echo_var "{}"'
movendo o {}
diretamente dentro dele. Mas é vulnerável à injeção de comandos, como apontado por @Sasha.
Aqui está um exemplo de por que você não deve usar o formato incorporado:
$ echo '$(date)' | xargs -I {} bash -c 'echo_var "{}"'
Sun Aug 18 11:56:45 CDT 2019
Outro exemplo de por que não :
echo '\"; date\"' | xargs -I {} bash -c 'echo_var "{}"'
É isso que é produzido usando o formato seguro :
$ echo '$(date)' | xargs -I {} bash -c 'echo_var "$@"' _ {}
$(date)
Isso é comparável ao uso de consultas SQL parametrizadas para evitar injeção .
Estou usando date
uma substituição de comando ou entre aspas aqui, em vez do rm
comando usado no comentário de Sasha, pois não é destrutivo.