O código dentro de { ... } é executado exatamente da maneira que seria executado sem as chaves, exceto que agora depende do status de saída de get_confirm .
Se get_confirm sair com um status de saída zero ("sucesso"), o bloco será executado, caso contrário, não.
É equivalente a
if get_confirm; then
# the contents of the block goes here
fi
(o que eu acho mais legal)
O exemplo do livro é IMHO não é um bom exemplo de uso comum de { ... } . Um melhor exemplo teria sido
{ echo 'hello world'; date; } >file
que usa um único redirecionamento para redirecionar a saída padrão de ambos os comandos no bloco { ... } para o mesmo arquivo.
Isto é semelhante a (e tem o mesmo efeito, neste caso, como)
( echo 'hello world'; date ) >file
mas as declarações dentro de { ... } são executadas no mesmo ambiente que o shell, enquanto as declarações em ( ... ) são executadas em um subshell (um ambiente separado).
Você pode ver a diferença com
{ a=42; }; echo $a
e
( a=1973 ); echo $a
O primeiro produzirá 42 , enquanto o segundo não produzirá 1973 (a atribuição acontece em um subshell e não pode afetar o ambiente externo).
Aviso sobre a gramática: o bloco } de { ... } de fechamento deve seguir uma nova linha ou um ; . { echo 'hello' } não é válido, enquanto { echo 'hello'; } e
{
echo 'hello'
}
são.