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 printf
anziché quello esterno seq
:
printf "n%04g\n" {1..100} | xargs -n 1 -P 10 -I {} bash -c 'echo_var "$@"' _ {}
Inoltre, usando return 0
e exit 0
così 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 date
una sostituzione di comando o tra virgolette di escape qui invece del rm
comando usato nel commento di Sasha poiché non è distruttivo.