Resumo : Se alguma vez houve um shell que expandiu {}
, este é um legado antigo.
No shell Bourne e em shells compatíveis com POSIX, chaves ( {
e }
) são caracteres comuns (ao contrário de (
e )
, que são delimitadores de palavras como ;
e &
e [
e ]
que são caracteres globbing). As seguintes strings devem ser impressas literalmente:
$ echo { } {} {foo,bar} {1..3}
{ } {} {foo,bar} {1..3}
Uma palavra que consiste em uma chave única é uma palavra reservada , que é apenas especial se for a primeira palavra de um comando.
O Ksh implementa a expansão de chaves como uma extensão incompatível para o shell Bourne. Isso pode ser desativado com set +B
. Bash emula ksh a esse respeito. Zsh implementa a expansão de contraventamento também; Lá, ele pode ser desativado com set +I
ou setopt ignore_braces
ou emulate sh
. Nenhum desses shells expande {}
em nenhum caso, mesmo quando é uma subseqüência de uma palavra (por exemplo, foo{}bar
), devido ao uso comum em argumentos para find
e xargs
.
Unix único v2 observa que
In some historical systems, the curly braces are treated as control operators. To assist in future standardisation activities, portable applications should avoid using unquoted braces to represent the characters themselves. It is possible that a future version of the ISO/IEC 9945-2:1993 standard may require that
{
and}
be treated individually as control operators, although the token{}
will probably be a special-case exemption from this because of the often-usedfind
{}
construct.
Esta nota foi descartada em versões subsequentes do padrão; Os exemplos de find
têm usos não cotados de {}
, assim como o < Exemplos de xargs
. Pode ter havido shells históricos de Bourne, onde {}
tinha que ser citado, mas eles seriam realmente antigos sistemas legados até agora.
As implementações do csh que tenho à mão (OpenBSD 4.7, BSD csh no Debian , tcsh) expandem {foo}
para foo
mas deixe {}
sozinho.