Експорт функції повинен виконувати це (неперевірено):
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
команди, що використовується в коментарі Саші, оскільки це не руйнує.