foo() any-command
是通过任何类似Bourne壳,但支持了Bourne语法bash,yash以及最新版本posh(其仅支持化合物命令)。(除非是复合命令,否则ksh不支持Bourne shell和AT&T实现)。foo() any-command > redirectionsany-command
foo() any-compound-command
(化合物的实例命令:{ cmd; },for i do echo "$i"; done,(cmd)...最常用的感{ ...; })
是任何类似Bourne的外壳以及您通常要使用的外壳所支持的POSIX语法。
function foo { ...; }
是Korn shell语法,它早于Bourne语法。仅在专门为Korn shell的AT&T实现编写并且需要在那里接受特定处理的情况下,才使用此代码。该语法不是POSIX,但受POSIX支持bash,yash并zsh与Korn Shell兼容,尽管这些Shell(以及pdkshKorn Shell 的- 基于-的变体)与标准语法没有任何区别。
function foo () { ...; }
是no shell 的语法,不应使用。它只是碰巧偶然的支持bash,yash,zsh和pdkshKorn shell中的基础变种。顺便说一句,它也是awk函数语法。
如果我们继续往下走,
function foo() other-compound-command
(如function foo() (subshell)或function foo() for i do; ... done)甚至更糟。受bash,yash和支持zsh,但不支持ksh,甚至不支持pdksh基于-的变体。
而:
function foo() simple command
仅受支持zsh。
function baz { echo "baz"; }。见Bashism在GreyCat的wiki。