Eksport funkcji powinien to zrobić (nieprzetestowany):
export -f echo_var
seq -f "n%04g" 1 100 | xargs -n 1 -P 10 -I {} bash -c 'echo_var "$@"' _ {}
Możesz użyć wbudowanego printf
zamiast zewnętrznego seq
:
printf "n%04g\n" {1..100} | xargs -n 1 -P 10 -I {} bash -c 'echo_var "$@"' _ {}
Ponadto użycie return 0
i w exit 0
ten sposób maskuje wszelkie wartości błędu, które mogą zostać wygenerowane przez poprzedzające je polecenie. Ponadto, jeśli nie ma błędu, jest to ustawienie domyślne, a zatem nieco zbędne.
@phobic wspomina, że polecenie Bash można uprościć do
bash -c 'echo_var "{}"'
przenosząc {}
bezpośrednio w nim. Ale jest podatny na wstrzyknięcie poleceń, jak wskazał @Sasha.
Oto przykład, dlaczego nie należy używać osadzonego formatu:
$ echo '$(date)' | xargs -I {} bash -c 'echo_var "{}"'
Sun Aug 18 11:56:45 CDT 2019
Inny przykład, dlaczego nie :
echo '\"; date\"' | xargs -I {} bash -c 'echo_var "{}"'
Oto, co jest wyprowadzane przy użyciu bezpiecznego formatu :
$ echo '$(date)' | xargs -I {} bash -c 'echo_var "$@"' _ {}
$(date)
Jest to porównywalne do używania sparametryzowanych zapytań SQL w celu uniknięcia wstrzyknięcia .
Używam date
tutaj zastępowania poleceń lub cudzysłowów zamiast rm
polecenia używanego w komentarzu Sashy, ponieważ jest ono nieniszczące.