Uma função é definida como:
do_something () {
do it
}
Eu conseguia entender o nome 'do_something' e o colchete para encapsular o código de ações, mas não consigo entender o que é o objetivo ()
aqui, pois não há parâmetros nomeados nos scripts do Bash. Pode ser melhor e direto defini-lo como
do_something {
do it
}
O que não entra em conflito com sua sintaxe atual e ainda mais declara que não há parâmetros nomeados. Para que serve ()
aqui?
Respostas:
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:
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 chamadodo_something
e passar{
como argumento para esse comando:Se já existe um comando chamado
do_something
, você está executando. Se já existe uma função chamadado_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: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-chavefunction
e 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 é quefunction
ela 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{
}
.fonte
O
()
token é dizer ao interpretador de shell que você está declarando uma função.Uma alternativa em
bash
éfunction
ou como uma linha, você pode testar
fonte
function
palavra-chave é um ksh-ism pré-POSIX que o bash suporta para compatibilidade com versões anteriores; no entanto, o bash o suporta mal (não tornando as variáveis padrão local de função, como o antigo ksh fazia nas funções declaradas nesse formulário). Conseqüentemente, não é ideal para novo código. Veja wiki.bash-hackers.org/scripting/obsoletetypeset
sem-g
em uma função sempre declara uma variável local. Com afunction
palavra - chave, variáveis de escopo bash e ksh da mesma maneira , não é?Como você é muito fiel ao seu estilo !
Considere outros estilos de chaves perfeitamente finos:
Como o shell pode dizer que essas são definições de funções e não simplesmente um comando
foo
seguido por listas de comandos? Em todos esses casos, é necessário um fator de desambiguação adicional, como()
afunction
palavra-chave.fonte
()
ou algo parecido.