我应该将shell函数定义为函数x()还是x()?

whi*_*fin 7 bash shell sh

我注意到有三种方法可以定义shell函数,我从来没有在任何地方看过它.

# Option 1
function log(){

}

# Option 2
log(){

}

# Option 3, added due to answers
function log{

}
Run Code Online (Sandbox Code Playgroud)

这三个定义之间有不同之处吗?他们的行为是不同的,还是只是外表?

是否应该使用哪种标准?我希望第一个选项更可取,因为我想它可以消除某些地方的模糊性.

提前致谢!

答案后编辑:投票结束为"基于意见"的人; 我询问了行为上的差异,而不仅仅是为什么人们认为我应该使用哪种行为.事实上,只有Bash支持一个,这意味着每个人都应该使用第二个选项.

小智 11

log() 
Run Code Online (Sandbox Code Playgroud)

Bourne Shell系列和任何类型的派生(破折号,yash)都支持它是POSIX标准语法,可能是您想用来编写与旧系统兼容的东西的语法.可能是你想要使用的那个.

function log () { ...; }
Run Code Online (Sandbox Code Playgroud)

由bash和zsh的,但同时使用支持function ()是完全错误的,应当避免.

function log { ...; }
Run Code Online (Sandbox Code Playgroud)

是Korn Shell语法,并且出于兼容性原因受bash和zsh支持,但不是POSIX

http://wiki.bash-hackers.org/scripting/obsolete关于"function log()"的引用

这是Korn和POSIX样式函数定义之间的合并 - 使用函数关键字和括号.它没有用处,没有历史基础或理由存在.它没有由POSIX指定.它被Bash,mksh,zsh和其他一些Korn shell所接受,它被视为与POSIX风格的函数相同.它不被AT&T ksh接受.永远不应该使用它.请参阅下表中的function关键字.Bash没有将此功能记录为明确弃用.

  • `function(){`可能过于冗长,但我不会说错:`bash`允许它. (2认同)

nwk*_*nwk 7

选项1和3的缺点是它们都是所谓的"基础".如果您想要跨shell兼容性(例如,使用shin*BSD),请使用选项2,因为任何POSIX shell都必须支持它.


Hen*_*eld 6

有点历史

对于绝对的Bourne shell和POSIX兼容性,请使用log () { ...; }.这在较旧的unix系统和小型Linux发行版中尤其重要,这些发行版往往包含最少的shell实现.

David Korn引入function关键字有一个特殊原因.他希望为ksh(ksh93)中的函数添加功能,并希望明确区分正常函数和增强函数.

ksh93,function name { ...; }使用局部变量定义的函数可以使用局部变量typeset var=value.

Bash使用关键字declarelocalafaik它们在两种类型的函数中都有效.甚至typeset是同义词declare.

混合语法,function (),和Bourne,ksh或POSIX都不兼容.


在我自己的ksh代码中,我倾向于使用大量函数,局部变量倾向于改进代码.如果我希望代码在更通用的shell中重用,那么ksh93我将恢复到POSIX样式函数并使用子shell来强制变量是本地的.