Ich versuche, einen Unterschied zwischen Shell-Subprozessaufruf mit runden Klammern und geschweiften Klammern zu verstehen. Ich dachte, dass geschweifte Klammern einen Unterprozess nicht starten, aber es scheint, dass sie einen Unterprozess starten. Wie interagieren (...) und {...} mit der Subshell-Erstellung mit Pipes in bash?
#!/bin/sh
a=1
b=1
(a=2;) | (a=3;)
{ b=2; } | { b=3; }
echo "a=$a"
echo "b=$b"
Dieses Skript druckt
a=1
b=1
So scheint es, dass alle Anrufungen innerhalb Subprozesse ausgeführt werden. Gibt es einen Unterschied zwischen ihnen in diesem Zusammenhang? Ich verstehe, dass, wenn ich &&
und ||
verwenden würde, dann {..}
wird kein Subprozess starten, aber ich versuche zu verstehen, wie Pipes arbeiten.
Nicht "alle Aufrufe", sondern "alle Pipelines". Und selbst das ist nicht ganz richtig - POSIX sh spezifiziert das Verhalten nicht, und einige Shells setzen unter Umständen eine Pipe-Komponente (erste, letzte oder solche) in den übergeordneten Prozess. –
... schauen Sie sich zum Beispiel die Option 'lastpipe' in bash an, die bei aktivierter Pipeline' a '3' oder 'b = 3' Ihrer Pipelines in der Parent-Shell ausführt (nur unter bestimmten einschränkenden Umständen) in den Dokumenten definiert). –
Aha, so '()' erzeugt immer einen Unterprozess und '{}' kann einen Unterprozess hervorbringen, wenn es erforderlich ist, oder kann den aktuellen Prozess wiederverwenden, wenn es möglich ist. Ist das korrekt? – vbezhenar