function foo() {}
我在info bash
中进行搜索查询,并查看POSIX的相关章节中的功能关键字但未找到任何内容。
某些bash脚本中使用的function
关键字是什么?这是一些不赞成的语法吗?
答案 0 :(得分:66)
在Bash中定义函数时,function
关键字是可选的,如manual中所述:
使用以下语法声明函数:
name () compound-command [ redirections ]
或
function name [()] compound-command [ redirections ]
语法的第一种形式通常是首选,因为它与Bourne / Korn / POSIX脚本兼容,因此更具便携性。
也就是说,有时您可能希望使用function
关键字来阻止Bash aliases与您的函数名称冲突。考虑这个例子:
$ alias foo="echo hi"
$ foo() { :; }
bash: syntax error near unexpected token `('
此处,'foo'
被同名别名的文本替换,因为它是命令的第一个单词。使用function
时,别名不会展开:
$ function foo() { :; }
答案 1 :(得分:60)
在函数名称也是别名的极少数情况下,function
关键字是必需的。没有它,Bash会在解析函数定义之前扩展别名 - 可能不是你想要的:
alias mycd=cd
mycd() { cd; ls; } # Alias expansion turns this into cd() { cd; ls; }
mycd # Fails. bash: mycd: command not found
cd # Uh oh, infinite recursion.
使用function
关键字,事情按预期工作:
alias mycd=cd
function mycd() { cd; ls; } # Defines a function named mycd, as expected.
cd # OK, goes to $HOME.
mycd # OK, goes to $HOME.
\mycd # OK, goes to $HOME, lists directory contents.
答案 2 :(得分:8)
保留字function
是可选的。请参阅bash man page中的“Shell函数定义”部分。