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


18

Sie kennen wahrscheinlich diese Gabelbombe :

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

Ich frage mich, warum es notwendig ist, nach der öffnenden geschweiften Klammer ein Leerzeichen einzufügen, damit sie analysiert werden kann.

Antworten:


13

{}

          { list; }

Wenn Sie eine Befehlsliste in geschweifte Klammern setzen, wird die Liste im aktuellen Shell-Kontext ausgeführt. Es wird keine Subshell erstellt. Die folgende Liste mit Semikolon (oder Zeilenvorschub) ist erforderlich.

Neben der Erstellung einer Unterschale gibt es aus historischen Gründen einen subtilen Unterschied zwischen diesen beiden Konstrukten. Die geschweiften Klammern sind reservierte Wörter, daher müssen sie 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


1
Ich habe mit Ihrer Antwort in meinem eigenen Beitrag auf dieser Seite gestritten. Es ist eine Funktion, keine Befehlsgruppierung.
donothingsuccessfully

3
@donothingsuccessfully Ein Funktionskörper ist eine Befehlsgruppierung.
Gilles 'SO- hör auf böse zu sein'

3

Ich denke, @rush kann hier eine richtige, wenn auch irreführende Antwort geben. Die Gabelbombe definiert eine Funktion mit dem Namen " :". Der Code in geschweiften Klammern wird erst ausgeführt, wenn die Funktion mit dem abschließenden " :" aufgerufen wird . Die geschweiften Klammern als Befehlsgruppierung und die geschweiften Klammern als Funktionskörper sind also syntaktisch identisch, weisen jedoch eine unterschiedliche Semantik auf.
Aus demselben Dokument wie @rush zitiert:

Beachten Sie, dass die geschweiften Klammern, die den Körper der Funktion umgeben, aus historischen Gründen in der gängigsten Verwendung durch Leerzeichen oder Zeilenumbrüche vom Körper getrennt sein müssen. Dies liegt daran, dass die geschweiften 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. Bei Verwendung der geschweiften Klammern muss die Liste mit einem Semikolon, einem '&' oder einer neuen Zeile abgeschlossen werden.


3
Nein, die Antwort von Rush ist richtig. Die geschweiften Klammern um einen Funktionskörper sind das gleiche syntaktische Element wie wenn sie nicht von einem Funktionskörper abgegrenzt sind. Siehe die Shell-Grammatikregeln : a function_bodyist a compound_command(plus ein optionales redirect_list). Das Leerzeichen wird benötigt, da {es sich um ein reserviertes Wort handelt und nicht um ein Sonderzeichen.
Gilles 'SO- hör auf böse zu sein'

Ja, wie gesagt, die Antwort von Rush ist richtig. Ja, sie sind syntaktisch die gleichen wie ich sagte. Aber es brace_groupverhält sich anders, wenn es Teil einer Funktion ist und wenn nicht. Ich habe die Befehlsgruppierung verwendet , um den letzteren Fall zu beschreiben, und dies wurde in Rushs Link beschrieben.
Donothingsuccessfully

2
Ich bin nicht sicher, ob der semantische Unterschied hier von Bedeutung ist, da es für den Parser auf die Syntax ankommt. Die eigentliche Antwort ist, dass {es sich nicht um einen Operator, sondern um ein reserviertes Wort handelt. Wörter müssen von anderen Wörtern getrennt werden, um als eindeutig zu gelten.
jw013
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.