Экспорт функции должен сделать это (не проверено):
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
команды, использованной в комментарии Саши, так как это не разрушительно.