Il y a quelques mois, j'ai tatoué une bombe à fourche sur mon bras et j'ai sauté les espaces blancs, car je pense que c'est plus joli sans eux. Mais à ma grande consternation, parfois (pas toujours) lorsque je l'exécute dans un shell, il ne démarre pas une bombe fourchette, mais il donne juste une erreur de syntaxe.
bash: syntax error near unexpected token `{:'
Hier, cela s'est produit lorsque j'ai essayé de l'exécuter dans le shell Bash d' un ami , puis j'ai ajouté un espace et cela a soudainement fonctionné, :(){ :|:& };:
au lieu de:(){:|:&};:
L'espace est-il important? ai-je tatoué une erreur de syntaxe sur mon bras?!
Il semble toujours fonctionner dans zsh , mais pas dans Bash.
Une question connexe n'explique rien sur les espaces blancs, ce qui est vraiment ma question; Pourquoi l'espace blanc est-il nécessaire à Bash pour pouvoir l'analyser correctement?
la source
Réponses:
Il y a une liste de caractères qui séparent les jetons dans BASH. Ces caractères sont appelés métacaractères et ils sont
|
,&
,;
,(
,)
,<
,>
, espace et onglet . D'un autre côté, les accolades ({
et}
) ne sont que des caractères ordinaires qui composent les mots.Omettre le deuxième espace avant
}
fera l'affaire, car&
c'est un métacaractère. Par conséquent, votre tatouage doit avoir au moins un caractère d'espace.la source
on the other hand
... jeu de mots voulu? ;): D (Désolé, pour le commentaire hors sujet.){
et}
sont des mots clés shell dans ce contexte. Ce n'est que s'ils ne sont pas reconnus comme tels - en raison du manque d'espaces / métacaractères environnants - qu'ils sont traités comme une partie littérale du mot dont ils deviennent une partie. (Et puis il y a l'expansion de l'accolade, qui se produit dans un contexte différent.){foo} () { echo hello; }
"Nom", tel que défini parbash
par "un mot composé uniquement de caractères alphanumériques et de soulignements, et commençant par un caractère alphabétique ou un soulignement", s'applique uniquement aux noms de variables.Il suffit de tatouer un
shebang dessus et vous irez bien.
la source
Les accolades ressemblent plus à des mots-clés impairs qu'à des symboles spéciaux et ont besoin d'espaces. C'est différent des parenthèses, par exemple. Comparer:
qui fonctionne, et:
qui recherche une commande nommée
{ls}
. Pour fonctionner, il faut:Le point-virgule empêche l'accolade fermante d'être prise comme paramètre pour
ls
.Tout ce que vous avez à faire est de dire aux gens que vous utilisez une police proportionnelle avec un caractère d'espace assez étroit.
la source
ls
.Bien qu'il ne soit pas facilement visible dans la police tatoo, il y a en fait une marque d'ordre des octets (BOM) entre l'accolade et le colon (vous avez peut-être été suffisamment intoxiqué lorsque vous avez reçu le tatouage que vous ne l'avez pas remarqué, mais il est vraiment là) . Cela laisse trois possibilités évidentes:
la source
C'est à cause de la façon dont le shell analyse. Vous avez besoin d'un espace après le début de la définition de la fonction, c'est-à-dire après le
{
.sont valides. D'autre part,
n'est pas.
Vous avez en fait besoin d'un tatouage comme celui-ci:
De la source :
L'omission d'un espace après le
{
fait que le{echo
soit interprété comme un seul jeton.Une forme équivalente de
serait
Notez qu'il n'y a pas d'espace après
{
dans la version alternative, mais un saut de ligne fait reconnaître le shell{
comme un jeton.la source
{echo
avant d'avoir atteint une accolade d'ouverture requise?