GNU Parallel-und Bash-Funktionen: so führen Sie das einfache Beispiel aus dem Handbuch
Ich versuche zu lernen, GNU Parallel, weil ich habe einen Fall, wo ich denke, ich könnte leicht parallelisieren, eine bash-Funktion. Also versuchen zu lernen, ging ich zu der GNU Parallel Handbuch wo es ein Beispiel...aber ich kann nicht sogar arbeiten! Zu Witz:
(232) $ bash --version
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
(233) $ cat tpar.bash
#!/bin/bash
echo `which parallel`
doit() {
echo Doing it for $1
sleep 2
echo Done with $1
}
export -f doit
parallel doit ::: 1 2 3
doubleit() {
echo Doing it for $1 $2
sleep 2
echo Done with $1 $2
}
export -f doubleit
parallel doubleit ::: 1 2 3 ::: a b
(234) $ bash tpar.bash
/home/mathomp4/bin/parallel
doit: Command not found.
doit: Command not found.
doit: Command not found.
doubleit: Command not found.
doubleit: Command not found.
doubleit: Command not found.
doubleit: Command not found.
doubleit: Command not found.
doubleit: Command not found.
Wie Sie sehen können, kann ich nicht mal das einfache Beispiel, um zu laufen. So, ich bin wohl etwas zu tun erstaunlich dumm und basic...aber ich bin ratlos.
ETA: Wie vorgeschlagen, durch Kommentatoren (chmod +x, set-vx):
(27) $ ./tpar.bash
echo `which parallel`
which parallel
++ which parallel
+ echo /home/mathomp4/bin/parallel
/home/mathomp4/bin/parallel
doit() {
echo Doing it for $1
sleep 2
echo Done with $1
}
export -f doit
+ export -f doit
parallel doit ::: 1 2 3
+ parallel doit ::: 1 2 3
doit: Command not found.
doit: Command not found.
doit: Command not found.
doubleit() {
echo Doing it for $1 $2
sleep 2
echo Done with $1 $2
}
export -f doubleit
+ export -f doubleit
parallel doubleit ::: 1 2 3 ::: a b
+ parallel doubleit ::: 1 2 3 ::: a b
doubleit: Command not found.
doubleit: Command not found.
doubleit: Command not found.
doubleit: Command not found.
doubleit: Command not found.
doubleit: Command not found.
ETA2: Anmerkung, ich kann in dem script, nur call 'doit-1', sagen Sie, und es wird das tun. So wird die Funktion gültig ist, ist es eben nicht...exportiert?
- Sind Sie sicher, dass Sie GNU parallel, und nicht die version von Tollef Fog Heen?
- Es ist GNU parallel: (247) $ parallel --version GNU parallel 20140522
- Ich habe versucht. Gleiche Antwort.
- Es funktioniert gut auf meinem Mac unter OSX. Haben Sie
tpar.bash
ausführbare Datei mitchmod +x tpar.bash
- Hilft es, wenn Sie hinzufügen
function
vordoit(){
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht an eine shell-Funktion, die von außerhalb der Hülle, wo es definiert wurde. Eine shell-Funktion ist ein Konzept, das im inneren der Schale. Die
parallel
Befehl selbst hat keine Möglichkeit, darauf zuzugreifen.Aufrufen
export -f doit
in der bash exportiert die Funktion, über die Umwelt, so dass es abgeholt wird von Kind-Prozessen. Aber nur bash versteht bash-Funktionen. Ein (grand)*Kind von bash-Prozess aufrufen können, nicht jedoch andere Programme, zum Beispiel nicht zu anderen shells.Gehen durch die Meldung "Befehl nicht gefunden", es scheint, dass Sie Ihre bevorzugte shell ist die (t)csh. Sie müssen sagen
parallel
aufrufen bash statt.parallel
ruft die shell, angedeutet durch denSHELL
Umfeld variable1, also Punkt-zu-bash.Wenn Sie nur wollen, setzen
SHELL
für die Ausführung derparallel
Befehl und nicht für den rest des Skripts:Ich bin mir nicht sicher, wie Sie sich mit remote-Arbeitsplätze, können Sie brauchen, um passieren
--env=SHELL
neben--env=doit
(beachten Sie, dass hier davon ausgegangen, dass der Pfad zubash
ist überall das gleiche).Und ja, diese oder jene Besonderheit sollte erwähnt werden, mehr prominent in der Anleitung. Es gibt einen kurzen Hinweis in der Beschreibung des
Befehl
- argument, aber es ist nicht sehr explizit (er sollte erklären, dass diecommand
Worte sind verkettet durch ein Leerzeichen als Trennzeichen und dann an$SHELL -c
), undSHELL
ist auch nicht aufgeführt in der Umgebungsvariablen Abschnitt. (Ich ermutige Sie, melden Sie dies als Fehler; ich mache das nicht, weil ich kaum jemals dieses Programm verwenden.)1 das ist schlechtes design, da
SHELL
zeigen soll, ein user-interface, die Vorliebe für eine interaktive Kommandozeilen-shell und nicht um das Verhalten von Programmen.SHELL
nur für dieparallel
Befehl (und dessen Subprozesse) ist auch eine option.Seit version 20160722 Sie können stattdessen
env_parallel
:Brauchen Sie nur zu aktivieren
env_parallel
indem es.bashrc
: