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
.