Próbuję użyć xargs do równoległego wywołania bardziej złożonej funkcji.
#!/bin/bash
echo_var(){
echo $1
return 0
}
seq -f "n%04g" 1 100 |xargs -n 1 -P 10 -i echo_var {}
exit 0
To zwraca błąd
xargs: echo_var: No such file or directory
Wszelkie pomysły, jak mogę użyć xargs, aby to osiągnąć, lub jakiekolwiek inne rozwiązania byłyby mile widziane.
Odpowiedzi:
Eksport funkcji powinien to zrobić (nieprzetestowany):
Możesz użyć wbudowanego
printf
zamiast zewnętrznegoseq
:Ponadto użycie
return 0
i wexit 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
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:
Inny przykład, dlaczego nie :
Oto, co jest wyprowadzane przy użyciu bezpiecznego formatu :
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 zamiastrm
polecenia używanego w komentarzu Sashy, ponieważ jest ono nieniszczące.źródło
echo_var
w PATH podajesz nazwę , która jest funkcją w tym skrypcie, a nie proces (program). Rozwiązanie Dennisa polega na wyeksportowaniu funkcji do użycia przez potomne procesy bash, a następnie rozwidleniu do podprocesu i wykonaniu tam._
i\
bez nich to nie działało dla mnie_
) zapewnia miejsce naargv[0]
($0
) i prawie wszystko może zostać tam użyte. Myślę, że dodałem odwrotny ukośnik-średnik (\;
) ze względu na jego użycie do zakończenia-exec
klauzuli wfind
, ale działa dla mnie bez niego tutaj. W rzeczywistości, gdyby funkcja miała użyć$@
zamiast$1
tego, zobaczyłaby średnik jako parametr, więc należy go pominąć.bash -c 'echo_var "{}"'
. Więc nie potrzebujesz znaku _ {} na końcu.Używanie GNU Parallel wygląda następująco:
Jeśli używasz wersji 20170822, nie musisz tego nawet robić, o
export -f
ile uruchomiłeś to:źródło
sh: parallel_bash_environment: line 67: unexpected EOF while looking for matching
'' sh: parallel_bash_environment: line 79: syntax error: nieoczekiwany koniec pliku sh: błąd podczas importowania definicji funkcji dlaparallel_bash_environment' /usr/local/bin/bash: parallel_bash_environment: line 67: unexpected EOF while looking for matching
'' / usr / local / bin / bash: parallel_bash_environment: line 79: syntax error: nieoczekiwany koniec file / usr / local / bin / bash: błąd podczas importowania definicji funkcji dla `...Coś takiego powinno też działać:
źródło
Może to zła praktyka, ale jeśli definiujesz funkcje w
.bashrc
skrypcie lub innym, możesz opakować plik lub przynajmniej definicje funkcji za pomocą ustawieniaallexport
:źródło