Ich habe ein Skript, das ich an einer Stelle teilen möchte, damit zwei Kopien desselben Skripts ausgeführt werden.
Ich möchte zum Beispiel, dass das folgende Bash-Skript existiert:
echo $$
do_fork()
echo $$
Wenn dieses Bash-Skript wirklich existieren würde, wäre die erwartete Ausgabe:
<ProcessA PID>
<ProcessB PID>
<ProcessA PID>
oder
<ProcessA PID>
<ProcessA PID>
<ProcessB PID>
Gibt es etwas, das ich anstelle von "do_fork ()" setzen kann, um diese Art von Ausgabe zu erhalten, oder um das Bash-Skript zu veranlassen, eine C-ähnliche Verzweigung auszuführen?
&
Ist eine Gabel, da ist keine Führungskraft beteiligt. Fork + exec ist, wenn Sie einen externen Befehl starten.exec
, aber die beiden Sprachen haben unterschiedliche Kontrollabläufe.&
startet eine Subshell, in der der angegebene Befehl ausgeführt wird. Gabel + Exec. Sie können nicht einfach&
ohne vorangestelltes Kommando ausführen.&
selbst eine Zeile setzen. Aber du kannst nicht. Es bedeutet nicht "Gabel hier". Es bedeutet "den vorhergehenden Befehl im Hintergrund in einer Subshell ausführen".Ja, es heißt Subshells . Shell-Code in Klammern wird als Subshell (Fork) ausgeführt. Die erste Shell wartet jedoch normalerweise darauf, dass das Kind fertig ist. Sie können es mit dem
&
Abschlusszeichen asynchron machen . Sehen Sie es in Aktion mit so etwas:$ bash subsh.sh
quelle
&
ist Gabel allein. Wenn Sie mehr als eine Pipeline im untergeordneten Prozess ausführen möchten, ist es ausreichend, geschweifte Klammern zu verwenden (die eine Gruppierung durchführen, ohne einen untergeordneten Prozess zu erstellen):{ sleep 2; echo child; } &
Es gibt keine native Bash-Methode (oder meines Wissens eine andere typische * nix-Shell), um dies zu tun. Es gibt viele Möglichkeiten, gegabelte Prozesse zu erzeugen, die etwas anderes asynchron ausführen, aber ich glaube, es gibt nichts, das der genauen Semantik des Systemaufrufs fork () entspricht.
Der typische Ansatz wäre, dass Ihr Skript der obersten Ebene Helfer hervorbringt, die genau die Arbeit leisten, die Sie aufteilen möchten. Wenn du das tust
$0 $@ &
oder was auch immer, fängst du wieder von vorne an und musst das irgendwie herausfinden.Eigentlich beginne ich mir mehrere clevere Möglichkeiten auszudenken, wie man genau das machen könnte ...
Aber bevor sich mein Gehirn davon zu sehr mitreißt, denke ich, lautet eine ziemlich gute Regel: Wenn Sie versuchen, etwas in Shell zu schreiben und es voller cleverer Tricks ist und Sie sich mehr Sprachfunktionen wünschen, ist Zeit zum Wechseln zu einer echten Programmiersprache .
quelle