Aufruf von shell-Funktionen mit xargs
Ich versuche, mit xargs aufrufen einer komplexeren Funktion, die parallel.
#!/bin/bash
echo_var(){
echo $1
return 0
}
seq -f "n%04g" 1 100 |xargs -n 1 -P 10 -i echo_var {}
exit 0
Dieser gibt den Fehler zurück
xargs: echo_var: No such file or directory
Irgendwelche Ideen auf, wie ich verwenden können, xargs, um dies zu erreichen, oder eine andere Lösung(en) wäre zu begrüßen.
Die Gefahr, user1148366, Gefahr! Nicht verwenden die bash-für die parallele Programmierung - führen Sie in so viele Probleme. Verwendung von C/C++, pthreads, oder Java-threads, oder etwas, das Sie denken, lange und hart über das, was Sie tun, denn die parallele Programmierung nimmt eine Menge Gedanken zu bekommen Recht.
Wenn die Aufgaben sind unabhängig, wie konvertiert alle diese Bild-Dateien in png, dann Mach dir keine sorgen. Es ist, wenn Sie synchronisation (jenseits warten, bis alle fertig) und die Kommunikation, es wird chaotisch.
Ich bin seit langer Zeit ein Java-dev und ich arbeiten bereits in groovy zu spät. Und ich weiterhin zu den Menschen sagen: Freunde lassen nicht Freunde schreiben bash-Skript. Und doch, ich finde mich in diesem Beitrag/Lösung, weil (trauriges Gesicht 🙁 ) ich bin beschäftigt bei der parallelen Verarbeitung in der bash. Ich könnte leicht tun Sie es in groovy/java. Schlecht!
Auch besprochen in unix.stackexchange.com/questions/158564/...
Wenn die Aufgaben sind unabhängig, wie konvertiert alle diese Bild-Dateien in png, dann Mach dir keine sorgen. Es ist, wenn Sie synchronisation (jenseits warten, bis alle fertig) und die Kommunikation, es wird chaotisch.
Ich bin seit langer Zeit ein Java-dev und ich arbeiten bereits in groovy zu spät. Und ich weiterhin zu den Menschen sagen: Freunde lassen nicht Freunde schreiben bash-Skript. Und doch, ich finde mich in diesem Beitrag/Lösung, weil (trauriges Gesicht 🙁 ) ich bin beschäftigt bei der parallelen Verarbeitung in der bash. Ich könnte leicht tun Sie es in groovy/java. Schlecht!
Auch besprochen in unix.stackexchange.com/questions/158564/...
InformationsquelleAutor fac3 | 2012-06-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Exportieren, die Funktion sollte es tun (ungetestet):
Können Sie die builtin
printf
anstelle des externenseq
:Auch mit
return 0
undexit 0
wie Masken, dass alle Fehler-Wert, der möglicherweise hergestellt werden, indem der Befehl vorhergehende. Auch, wenn es keine Fehler, es ist der Standard und somit etwas überflüssig.echo_var
, die eine Funktion in diesem Skript, nicht ein Prozess (Programm) in Ihrem PFAD. Was Dennis' Lösung tut, ist eine export-Funktion für ein Kind bash-Prozesse zu verwenden, dann Gabeln auf den Teilprozess und führt es.was ist die Bedeutung des
_
und\
, ohne Sie war es nicht für mich arbeitenDer Unterstrich (
_
) stellt einen Platzhalter fürargv[0]
($0
) und fast alles konnte verwendet werden, da. Ich denke, ich habe das backslash-Semikolon (\;
), da Ihr Einsatz in der Einstellung der-exec
Klausel infind
, aber es funktioniert für mich ohne Sie hier. In der Tat, wenn Sie die Funktion verwenden$@
statt$1
dann würde Sie sehen das Semikolon als parameter, so sollte es weggelassen werden.-ich argument xargs ist da veraltet. Verwenden Sie -I (groß i) statt.
Vereinfachen Sie diese, indem Sie das argument von xargs in der Kommando-string für die bash mit
bash -c 'echo_var "{}"'
. So brauchen Sie nicht, den _ {} am Ende.InformationsquelleAutor Dennis Williamson
Mit GNU Parallel ist, sieht wie folgt aus:
Wenn Sie version 20170822 Sie müssen auch nicht
export -f
solange Sie dies ausführen:nvm es ist setopt in der zsh
Immer diese unten eerror Ole
sh: parallel_bash_environment: line 67: unexpected EOF while looking for matching
" sh: parallel_bash_environment: Zeile 79: syntax Fehler: unerwartetes Ende der Datei sh: Fehler beim importieren der Funktionsdefinition fürparallel_bash_environment' /usr/local/bin/bash: parallel_bash_environment: line 67: unexpected EOF while looking for matching
" /usr/local/bin/bash: parallel_bash_environment: Zeile 79: syntax Fehler: unerwartetes Ende der Datei /usr/local/bin/bash: error importing function definition for ` ...Sie wurden shellaftershocked: Shellshock nicht auf GNU Parallel direkt. Die Lösung für shellshock, jedoch nicht: Es restlos pleite --env und die env_parallel trick. Es wird angenommen, dass Sie fest in die git-version: git.savannah.gnu.org/cgit/parallel.git/snapshot/...
Ich mag diese Antwort, weil es mich zu entdecken, die parallel tool
InformationsquelleAutor Ole Tange
Etwas wie dieses auch funktionieren sollte:
InformationsquelleAutor Eremite
Vielleicht ist das eine schlechte Praxis, aber Sie, wenn Sie der Definition von Funktionen in einer
.bashrc
oder andere Skript, Sie können wickeln Sie die Datei oder zumindest die Funktionsdefinitionen mit einer Einstellung vonallexport
:InformationsquelleAutor xdhmoore