Pourquoi whitespace est-il parfois nécessaire autour de metacharacters?

il y a quelques mois, j'ai tatoué une bombe à fourche sur mon bras, et j'ai sauté les espaces blancs, parce que je pense qu'il semble plus agréable sans eux. Mais à mon grand désarroi, parfois (pas toujours) quand je l'exécute dans un shell il ne démarre pas une bombe fourche, mais il donne juste une erreur de syntaxe.

bash: syntax error near unexpected token `{:'

hier c'est arrivé quand j'ai essayé de l'exécuter dans la coquille d'un ami Bash , et puis j'ai ajouté l'espace blanc et il a soudainement fonctionné, :(){ :|:& };: au lieu de :(){:|:&};:

est-ce que l'espace blanc est important; ai-je tatoué une erreur de syntaxe sur mon bras?!

Il semble toujours dans les zsh , mais pas dans Bash.

A une question relative à la n'explique rien sur les espaces, ce qui est vraiment ma question; Pourquoi l'espace nécessaire pour Bash pour être en mesure de l'analyser correctement?

533
demandé sur codeforester 2014-01-17 17:03:05
la source

5 ответов

il y a une liste de caractères qui séparent les jetons de BASH. Ces caractères sont appelés métacaractères et ils sont | , & , ; , ( , ) , < , > , l'espace et onglet . D'un autre côté, les accolades ( { et } ) sont des caractères ordinaires qui composent les mots.

omettant la seconde espace avant } fera l'affaire, puisque & est un metacharacter. Par conséquent, votre tatouage doit avoir au moins un caractère d'espace.

:(){ :|:&};:
262
répondu Dmitri Chubarov 2014-06-09 19:16:07
la source

Juste un tatouage

#!/bin/zsh

shebang au-dessus et tout ira bien.

76
répondu SzG 2015-07-08 17:10:51
la source

Accolades sont plus comme des mots-clés impairs que des symboles spéciaux, et ont besoin d'espaces. C'est différent des parenthèses, par exemple. Comparer:

(ls)

qui fonctionne, et:

{ls}

qui recherche une commande nommée {ls} . Pour fonctionner, il doit être:

{ ls; }

le point-virgule empêche que l'attelle de fermeture soit prise comme paramètre pour ls .

Tout ce que vous avez à faire est de dire les gens que vous utilisez une police proportionnelle avec un caractère d'espace assez étroit.

49
répondu Peter Westlake 2014-01-17 17:18:11
la source

bien que difficilement visible dans la police tatoo, il y a en fait une marque D'ordre de Octet (BOM) entre le support et le côlon (vous avez peut-être été suffisamment intoxiqué quand vous avez eu le tatoo que vous ne l'avez pas remarqué, mais il est vraiment là). Cela laisse trois possibilités évidentes:

  1. vous n'avez pas réussi à taper le BOM lorsque vous avez transcrit le code. Le résultat est une application évidente de GIGO. La coquille ne reconnaît tout simplement pas un BOM qui n'est pas présent dans votre transcription ratée.
  2. votre coquille est trop vieille. Il ne reconnaît pas les caractères Unicode, de sorte que le BOM (et probablement tous les autres caractères Unicode) est complètement ignoré, même si un BOM n'importe où mais le début d'un fichier est censé être traité comme un zéro-largeur, espace sans rupture.
  3. votre coquille est trop neuve. L'utilisation D'un BOM comme ZWNBS est dépréciée, et les auteurs ont implémenté une future version D'Unicode dans laquelle cet usage n'est plus autorisée.
40
répondu Jerry Coffin 2014-01-22 08:43:23
la source

et puis j'ai ajouté l'espace blanc et ça a soudainement fonctionné ...

c'est à cause de la façon dont la coquille se déforme. Vous avez besoin d'un espace après le début de la définition de la fonction, i.e. après le { .

foo() { echo hey& }
foo() { echo hey&}
foo(){ echo hey&}

sont valables. D'autre part,

foo() {echo hey&}

n'est pas.


Vous avez réellement besoin d'un tatouage comme ceci:

enter image description here


De la source :

  /* We ignore an open brace surrounded by whitespace, and also
     an open brace followed immediately by a close brace preceded
     by whitespace.  */

omettre un espace après le { fait que le {echo est interprété comme un jeton unique.


une forme équivalente de

:(){ :|:& };:

serait

:(){
:|:& };:

Notez qu'il n'y a pas d'espace après { dans la version alternative, mais une rupture de ligne fait que le shell reconnaît { comme un token.

39
répondu devnull 2017-01-21 23:34:06
la source

Autres questions sur bash syntax shell syntax-error