Há alguns meses, tatuei uma bomba de garfo no braço e pulei os espaços em branco, porque acho que fica melhor sem eles. Mas, para minha consternação, às vezes (nem sempre) quando eu o executo em um shell, ele não inicia uma bomba, mas apenas gera um erro de sintaxe.
bash: syntax error near unexpected token `{:'
Ontem aconteceu quando tentei executá-lo no shell Bash de um amigo e, em seguida, adicionei o espaço em branco e, de repente, funcionou, em :(){ :|:& };:
vez de:(){:|:&};:
O espaço em branco importa; tatuei um erro de sintaxe no meu braço ?!
Parece sempre funcionar no zsh , mas não no Bash.
Uma pergunta relacionada não explica nada sobre os espaços em branco, o que realmente é minha pergunta; Por que o espaço em branco necessário para o Bash é capaz de analisá-lo corretamente?
bash
shell
syntax
syntax-error
Spydon
fonte
fonte
Respostas:
Há uma lista de caracteres que separam os tokens no BASH. Esses personagens são chamados de metacaracteres e eles são
|
,&
,;
,(
,)
,<
,>
, espaço e guia . Por outro lado, chavetas ({
e}
) são apenas caracteres comuns que compõem palavras.Omitir o segundo espaço antes
}
servirá, pois&
é um metacaractere. Portanto, sua tatuagem deve ter pelo menos um caractere de espaço.fonte
on the other hand
... trocadilhos? ;): D (Desculpe, para fora do comentário tópico).{
e}
são palavras-chave shell neste contexto. Somente se não forem reconhecidos como tal - devido à falta de espaços / metacaracteres ao redor - eles serão tratados como uma parte literal da palavra da qual se tornam parte. (E então há expansão cinta, o que acontece num contexto diferente.){foo} () { echo hello; }
"Nome", como definido porbash
"uma palavra que consiste apenas em caracteres alfanuméricos e sublinhados e que começa com um caractere alfabético ou sublinhado", aplica-se apenas a nomes de variáveis.Apenas tatuar um
shebang acima e você vai ficar bem.
fonte
Chaves são mais parecidas com palavras-chave ímpares do que símbolos especiais e precisam de espaços. Isso é diferente dos parênteses, por exemplo. Comparar:
que funciona e:
que procura um comando chamado
{ls}
. Para funcionar, tem que ser:O ponto-e-vírgula impede que a chave de fechamento seja usada como parâmetro para
ls
.Tudo o que você precisa fazer é dizer às pessoas que você está usando uma fonte proporcional com um caractere de espaço bastante estreito.
fonte
ls
.Embora não seja facilmente visível na fonte da tatuagem, na verdade há uma BOM (marca de ordem de bytes) entre a chave e o cólon (você pode ter ficado intoxicado o suficiente quando recebeu a tatuagem que não notou, mas está realmente lá) . Isso deixa três possibilidades óbvias:
fonte
É por causa de como o shell analisa. Você precisa de um espaço após o início da definição da função, ou seja, após o
{
.é válido. Por outro lado,
não é.
Você realmente precisa de uma tatuagem como esta:
Da fonte :
A omissão de um espaço após as
{
causas faz{echo
com que seja interpretado como um único token.Uma forma equivalente de
seria
Observe que não há espaço depois
{
na versão alternativa, mas uma quebra de linha faz com que o shell seja reconhecido{
como um token.fonte
{echo
antes de atingir a chave de abertura necessária?