Sem o (), a sintaxe seria realmente ambígua.
Deve haver alguma sintaxe inequívoca para definir uma função e, sem alterar substancialmente outra sintaxe do shell, não pode ser isso:
do_something {
# one or more commands go here
}
Você disse que "não está em conflito com a sintaxe atual", mas sim! Observe que você não recebe nenhum tipo de erro de sintaxe ao tentar executar a primeira linha disso . Você recebe um erro, mas não é um erro sobre sintaxe. A segunda linha, com }, é um erro de sintaxe, mas a primeira linha não é. Em vez disso, do_something {tenta executar um comando chamado do_somethinge passar {como argumento para esse comando:
$ do_something {
do_something: command not found
Se já existe um comando chamado do_something, você está executando. Se já existe uma função chamada do_something, você está chamando . Em geral, é importante que a sintaxe seja inequívoca, mas também é importante especificamente que seja possível redefinir uma função sem chamá-la acidentalmente. Definir uma função e chamá-la não deve ser a mesma.
Como a concha trata {e (.
Como type {lhe dirá, {é uma palavra-chave shell. Isso faz com que seja [[. Se usado em uma situação em que seria um comando, {carrega semântica especial. Especificamente, ele executa o agrupamento de comandos. Em outras situações, no entanto, pode ser usado sem escape para denotar um {caractere literal . Isso inclui a situação de transmiti-lo como uma segunda palavra ou palavra subsequente de um comando.
Obviamente, o Bash poderia ter sido projetado para tratar de maneira {diferente do que atualmente. No entanto, sua sintaxe não seria mais compatível com o shell POSIX, e o Bash não seria realmente um shell no estilo Bourne e não seria capaz de executar muitos scripts de shell.
Em contraste, (é um metacaractere de concha. É sempre tratadas, especialmente se ele aparece em um comando e não é citado (com ' ', " "ou \). Portanto, não há ambiguidade na sintaxe:
do_something() {
# one or more commands go here
}
Isso não poderia significar mais nada. Se o Bash não tivesse funções, seria um erro de sintaxe, pelo mesmo motivo que echo foo(bar)é um erro de sintaxe.
Se você realmente não gosta da ()notação, pode usar a palavra-chave functione omiti-la, como menciona sudodus . Observe que isso não faz parte da sintaxe para definir funções na maioria dos outros shells no estilo Bourne - e, em alguns, é suportado, mas as funções definidas dessa maneira têm semânticas diferentes - e, portanto, um script que o utiliza não será portátil. (O motivo pelo qual essa sintaxe pode ser inequívoca é que functionela própria é uma palavra-chave no Bash que significa que o que quer que se segue é o início de uma definição de função.)
Finalmente, observe que, embora a maioria das definições de funções seja utilizada {na prática, qualquer comando composto é permitido. Se você tivesse uma função cujo corpo você sempre quisesse executar em um subshell, poderia usar em ( )vez de { }.