Vor ein paar Monaten habe ich eine Gabelbombe auf meinen Arm tätowiert und die Leerzeichen übersprungen, weil ich denke, dass es ohne sie schöner aussieht. Aber zu meiner Bestürzung startet es manchmal (nicht immer), wenn ich es in einer Shell laufen lasse, keine Gabelbombe, sondern es gibt nur einen Syntaxfehler.
bash: syntax error near unexpected token `{:'
Gestern passierte es, als ich versuchte, es in der Bash- Shell eines Freundes auszuführen , und dann fügte ich das Leerzeichen hinzu, und es funktionierte plötzlich :(){ :|:& };:
statt:(){:|:&};:
Ist das Leerzeichen wichtig? Habe ich einen Syntaxfehler auf meinen Arm tätowiert?!
Es scheint immer in zsh zu funktionieren , aber nicht in Bash.
Eine verwandte Frage erklärt nichts über die Leerzeichen, was wirklich meine Frage ist; Warum wird das Leerzeichen benötigt, damit Bash es richtig analysieren kann?
quelle
Antworten:
Es gibt eine Liste von Zeichen, die Token in BASH trennen. Diese Zeichen werden als Meta - Zeichen , und sie sind
|
,&
,;
,(
,)
,<
,>
, Raum und Reiter . Auf der anderen Seite sind geschweifte Klammern ({
und}
) nur gewöhnliche Zeichen, aus denen Wörter bestehen.Das Weglassen des zweiten Leerzeichens reicht aus
}
, da&
es sich um ein Metazeichen handelt. Daher sollte Ihr Tattoo mindestens ein Leerzeichen haben.quelle
on the other hand
... Wortspiel beabsichtigt? ;): D (Entschuldigung, für den Kommentar zum Thema.){
und in diesem Zusammenhang Shell-Schlüsselwörter}
sind . Nur wenn sie aufgrund des Mangels an umgebenden Räumen / Metazeichen nicht als solche erkannt werden, werden sie als wörtlicher Teil des Wortes behandelt, zu dem sie gehören. (Und dann gibt es eine{foo} () { echo hello; }
. "Name", definiertbash
als "ein Wort, das nur aus alphanumerischen Zeichen und Unterstrichen besteht und mit einem alphabetischen Zeichen oder einem Unterstrich beginnt", gilt nur für Variablennamen.Einfach tätowieren a
Shebang darüber und es wird dir gut gehen.
quelle
Klammern sind eher ungerade Schlüsselwörter als spezielle Symbole und benötigen Leerzeichen. Dies unterscheidet sich beispielsweise von Klammern. Vergleichen Sie:
was funktioniert und:
welches nach einem Befehl namens sucht
{ls}
. Um zu arbeiten, muss es sein:Das Semikolon verhindert, dass die schließende Klammer als Parameter für verwendet wird
ls
.Alles, was Sie tun müssen, ist den Leuten zu sagen, dass Sie eine Proportionalschrift mit einem ziemlich engen Leerzeichen verwenden.
quelle
ls
.Obwohl in der Tätowierungsschrift nicht leicht sichtbar, befindet sich zwischen der Klammer und dem Doppelpunkt tatsächlich ein Byte-Order Mark (BOM) (Sie waren möglicherweise ausreichend betrunken, als Sie das Tätowier erhalten haben, dass Sie es nicht bemerkt haben, aber es ist wirklich vorhanden). . Dies lässt drei offensichtliche Möglichkeiten:
quelle
Es liegt daran, wie die Shell analysiert. Sie benötigen ein Leerzeichen, nachdem die Funktionsdefinition begonnen hat, dh nach dem
{
.sind gültig. Auf der anderen Seite,
ist nicht.
Sie brauchen tatsächlich eine Tätowierung wie diese:
Aus der Quelle :
Das Weglassen eines Leerzeichens nach dem
{
bewirkt{echo
, dass das als einzelnes Token interpretiert wird.Eine äquivalente Form von
wäre
Beachten Sie, dass
{
in der alternativen Version kein Leerzeichen mehr vorhanden ist. Durch einen Zeilenumbruch wird die Shell jedoch{
als Token erkannt .quelle
{echo
bevor er eine erforderliche Öffnungsklammer erreicht hat?