我注意到有三种方法可以定义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没有将此功能记录为明确弃用.
对于绝对的Bourne shell和POSIX兼容性,请使用log () { ...; }.这在较旧的unix系统和小型Linux发行版中尤其重要,这些发行版往往包含最少的shell实现.
David Korn引入function关键字有一个特殊原因.他希望为ksh(ksh93)中的函数添加功能,并希望明确区分正常函数和增强函数.
在ksh93,function name { ...; }使用局部变量定义的函数可以使用局部变量typeset var=value.
Bash使用关键字declare和localafaik它们在两种类型的函数中都有效.甚至typeset是同义词declare.
混合语法,function 和 (),和Bourne,ksh或POSIX都不兼容.
在我自己的ksh代码中,我倾向于使用大量函数,局部变量倾向于改进代码.如果我希望代码在更通用的shell中重用,那么ksh93我将恢复到POSIX样式函数并使用子shell来强制变量是本地的.
| 归档时间: |
|
| 查看次数: |
245 次 |
| 最近记录: |