Ausführen oder nicht ausführen
Ein Aufruf von exec ersetzt die Daten einer Shell, und daher kann die Shell nicht von einem Systemaufruf von exec zurückkehren.
Aber nicht jeder Befehl ist der Name eines auszuführenden Programms. So oft ist kein exec
Anruf beteiligt. Der Hauptunterschied besteht darin, dass Sie im Gegensatz ( cmd1; cmd2; )
dazu keinen weiteren Shell-Prozess erhalten. Oder besser gesagt, die Shell gibt nur untergeordnete Programme aus, keine Shell-Prozesse.
Seltsame Eingabeaufforderung
Was gehört die Kommandozeile dazu?
Wie andere Antworten gezeigt haben, war Ihr Befehl unvollständig. Die Kommandozeile gehörte also zu Bash selbst, das auf das Ende Ihrer Gruppe wartete.
Verwendet
Wie ist es in irgendeiner Weise nützlich, Befehle in der aktuellen Shell auszuführen?
… Im Gegensatz zur Subshell-Gruppierung
Das bekannteste Beispiel ist das Festlegen von Variablen in diesem Unterbefehl. Dein das:
foo=1; { foo=2; echo $foo; }; ( foo=3; echo $foo; ); echo $foo
Dies wird gedruckt
2
3
2
Obwohl Sie foo=3
innerhalb einer Gruppe festgelegt haben, wurde diese Gruppe in einer Subshell ausgeführt und ihre Einstellungen wurden nicht an die übergeordnete Gruppe weitergegeben.
Eine andere erwägenswerte Sache ist das aktuelle Arbeitsverzeichnis. { cd foo; make; }
Sie werden im Verzeichnis foo
belassen, während ( cd foo; make; )
das aktuelle Arbeitsverzeichnis Ihrer Haupt-Shell nicht geändert wird.
… Im Gegensatz zu nicht gruppierten Befehlen
Die Gruppierung ist meistens nützlich, wenn Sie anderen Code außerhalb haben, z. B. Bedingungen
test -f foo && { echo "Foo exists."; rm foo; }
oder Weiterleitungen
{ echo "Content of $PWD:"; ls; } | gzip > dirlist.gz