Экспорт функции должен сделать это (не проверено):
export -f echo_var
seq -f "n%04g" 1 100 | xargs -n 1 -P 10 -I {} bash -c 'echo_var "$@"' _ {}
Вы можете использовать встроенный printfвместо внешнего seq:
printf "n%04g\n" {1..100} | xargs -n 1 -P 10 -I {} bash -c 'echo_var "$@"' _ {}
Кроме того, использование return 0и тому exit 0подобное маскирует любое значение ошибки, которое может быть создано командой, предшествующей ему. Кроме того, если нет ошибки, это по умолчанию и, следовательно, несколько избыточно.
@phobic упоминает, что команда Bash может быть упрощена до
bash -c 'echo_var "{}"'
двигая {}прямо внутри него. Но это уязвимо для внедрения команд, как указано @Sasha.
Вот пример, почему вы не должны использовать встроенный формат:
$ echo '$(date)' | xargs -I {} bash -c 'echo_var "{}"'
Sun Aug 18 11:56:45 CDT 2019
Еще один пример, почему нет :
echo '\"; date\"' | xargs -I {} bash -c 'echo_var "{}"'
Вот что выводится в безопасном формате :
$ echo '$(date)' | xargs -I {} bash -c 'echo_var "$@"' _ {}
$(date)
Это сравнимо с использованием параметризованных запросов SQL, чтобы избежать внедрения .
Я использую dateв подстановке команд или в кавычках здесь вместо rmкоманды, использованной в комментарии Саши, так как это не разрушительно.