Shell-Funktionsdefinition: Warum steht nach der öffnenden Klammer ein Leerzeichen?

Shell-Funktionsdefinition: Warum steht nach der öffnenden Klammer ein Leerzeichen?

Das wissen Sie wahrscheinlichGabelbombe:

 :(){ :|:&};: #WARNING: harmful code

Ich frage mich, warum es für die Analyse notwendig ist, nach der öffnenden geschweiften Klammer ein Leerzeichen einzufügen.

Antwort1

{}

          { list; }

Wenn Sie eine Liste von Befehlen in geschweifte Klammern setzen, wird die Liste im aktuellen Shell-Kontext ausgeführt. Es wird keine Subshell erstellt. Das Semikolon (oder der Zeilenumbruch) nach der Liste ist erforderlich.

Neben der Erstellung einer Subshell gibt es aus historischen Gründen einen subtilen Unterschied zwischen diesen beiden Konstrukten. Die Klammern sind reservierte Wörter und müssen daher durch Leerzeichen oder andere Shell-Metazeichen von der Liste getrennt werden. Die Klammern sind Operatoren und werden von der Shell als separate Token erkannt, auch wenn sie nicht durch Leerzeichen von der Liste getrennt sind.

//Quelle

Antwort2

Ich denke, @rush gibt hier eine korrekte, wenn auch irreführende Antwort. Die Fork-Bombe definiert eineFunktionaufgerufen " :". Der Code in den geschweiften Klammern wird erst ausgeführt, wenn die Funktion durch das abschließende " :" aufgerufen wird. Die geschweiften Klammern alsBefehlsgruppierungund die geschweiften Klammern alsFunktionskörpersind syntaktisch gleich, haben aber unterschiedliche Semantik.
Aus derselbendokumentierenwie @rush zitiert:

Beachten Sie, dass aus historischen Gründen die geschweiften Klammern, die den Hauptteil der Funktion umgeben, in der gebräuchlichsten Verwendung durch Leerzeichen oder Zeilenumbrüche vom Hauptteil getrennt werden müssen. Dies liegt daran, dass die Klammern reservierte Wörter sind und nur dann als solche erkannt werden, wenn sie durch Leerzeichen oder ein anderes Shell-Metazeichen von der Befehlsliste getrennt sind. Wenn Sie die Klammern verwenden, muss die Liste außerdem durch ein Semikolon, ein „&“ oder einen Zeilenumbruch abgeschlossen werden.

verwandte Informationen