L'esportazione della funzione dovrebbe farlo (non testato):
export -f echo_var
seq -f "n%04g" 1 100 | xargs -n 1 -P 10 -I {} bash -c 'echo_var "$@"' _ {}
È possibile utilizzare il comando incorporato printfanziché quello esterno seq:
printf "n%04g\n" {1..100} | xargs -n 1 -P 10 -I {} bash -c 'echo_var "$@"' _ {}
Inoltre, usando return 0e exit 0così si maschera qualsiasi valore di errore che potrebbe essere prodotto dal comando che lo precede. Inoltre, se non ci sono errori, è l'impostazione predefinita e quindi in qualche modo ridondante.
@phobic menziona che il comando Bash potrebbe essere semplificato
bash -c 'echo_var "{}"'
spostando {}direttamente al suo interno. Ma è vulnerabile al comando di iniezione come sottolineato da @Sasha.
Ecco un esempio per cui non dovresti usare il formato incorporato:
$ echo '$(date)' | xargs -I {} bash -c 'echo_var "{}"'
Sun Aug 18 11:56:45 CDT 2019
Un altro esempio del perché no :
echo '\"; date\"' | xargs -I {} bash -c 'echo_var "{}"'
Questo è ciò che viene emesso usando il formato sicuro :
$ echo '$(date)' | xargs -I {} bash -c 'echo_var "$@"' _ {}
$(date)
Questo è paragonabile all'utilizzo di query SQL con parametri per evitare l' iniezione .
Sto usando dateuna sostituzione di comando o tra virgolette di escape qui invece del rmcomando usato nel commento di Sasha poiché non è distruttivo.