foo() any-command
é a sintaxe Bourne suportada por qualquer shell semelhante ao Bourne bash
, yash
e versões recentes posh
(que suportam apenas comandos compostos). (as implementações Bourne shell e AT&T de ksh
não suportam, a foo() any-command > redirections
menos que any-command
seja 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
, yash
e zsh
para compatibilidade com o shell Korn, embora esses shells (e as pdksh
variantes 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
, zsh
e as pdksh
variantes com base do shell Korn. Aliás, também é a awk
sintaxe 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
, yash
e zsh
, mas não por ksh, até pelas pdksh
variantes baseadas em.
Enquanto:
function foo() simple command
é suportado apenas por zsh
.
function baz { echo "baz"; }
. Veja Bashism no wiki de GreyCat.