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.
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:
{}
{ 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
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.
function_body
ist 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.
brace_group
verhä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.
{
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.