foo() any-command
é a sintaxe Bourne suportada por qualquer shell semelhante ao Bourne bash, yashe versões recentes posh(que suportam apenas comandos compostos). (as implementações Bourne shell e AT&T de kshnão suportam, a foo() any-command > redirectionsmenos que any-commandseja um comando composto).
foo() any-compound-command
(exemplos de composto de comandos: { cmd; }, for i do echo "$i"; done, (cmd)... a ser mais utilizada { ...; })
é a sintaxe do POSIX suportada por qualquer shell semelhante ao Bourne e a que você geralmente deseja usar.
function foo { ...; }
é a sintaxe do shell Korn, que antecede a sintaxe Bourne. Use este apenas se estiver escrevendo especificamente para a implementação da shell Korn da AT&T e precisar do tratamento específico recebido nele. Essa sintaxe não é POSIX, mas é suportada por bash, yashe zshpara compatibilidade com o shell Korn, embora esses shells (e as pdkshvariantes baseadas no shell Korn) não o tratem de forma diferente da sintaxe padrão.
function foo () { ...; }
é a sintaxe de nenhum shell e não deve ser usada . Isso só acontece de ser apoiado por acidente por bash, yash, zshe as pdkshvariantes com base do shell Korn. Aliás, também é a awksintaxe da função.
Se continuarmos descendo a lista esotérica,
function foo() other-compound-command
(como function foo() (subshell)ou function foo() for i do; ... done) é ainda pior. É suportado por bash, yashe zsh, mas não por ksh, até pelas pdkshvariantes baseadas em.
Enquanto:
function foo() simple command
é suportado apenas por zsh.
function baz { echo "baz"; }. Veja Bashism no wiki de GreyCat.