Em bash e a maioria dos shells POSIX, enquanto ( e ) são caracteres de token especiais na sintaxe do shell (eles são tratados especialmente onde quer que apareçam, incluindo como parte de tokens de vários caracteres como (( , $( , <( , $(( , <#(( ...), { e } não são exceções quando combinadas com caracteres de token especiais, como em ${ , ou são usadas na% especial{x,y} ou {x..y} form.
Você notará que, enquanto echo ) der um erro, echo } não e sairá com } , portanto, o } em {echo} não poderá fechar o { .
Especificamente, { e } são palavras-chave como while , time , ! . Eles só podem ocorrer onde um comando é esperado (em uma primeira aproximação) e somente quando uma palavra separada.
{echo seria o comando {echo , não a palavra-chave { seguida por echo . Assim como while[ seria o comando while[ e não a palavra-chave while seguida por [ .
Você pode ter { echo;} ou {<file cat;} em que { e } estão delimitados e na posição de comando, mas não {echo} .
Existem algumas exceções. Você perceberá que {(echo test)} também funciona, embora nada seja normalmente esperado após esse fechamento ) , exceto os redirecionamentos, e que } não esteja na posição de comando. O mesmo para { { echo; } } , em que o segundo } não está na posição de comando.
{ echo; ! } ou { echo; time } trabalham em ksh93, mas não em bash (embora esses } estejam na posição de comando.
Uma exceção a isso é zsh que tenta reconhecer { e } como tokens quando possível. Isto é, quando em posição de comando e em alguns casos limitados. {echo} funciona lá, mas {{echo}} não faz por exemplo (apesar de {{echo} } ). {echo,foo} é como { echo,foo;} lá, em vez de echo foo de bash / ksh.
<file {head;head} funciona em zsh enquanto não funciona em outros shells.
Isso é controlado pelas opções IGNORE_BRACES e IGNORE_CLOSE_BRACES .