什么是一些bash脚本中使用的'function'关键字?

时间:2011-10-27 14:00:50

标签: bash

例如: Bash-Prog-Intro-HOWTO

function foo() {}

我在info bash中进行搜索查询,并查看POSIX的相关章节中的功能关键字但未找到任何内容。

某些bash脚本中使用的function关键字是什么?这是一些不赞成的语法吗?

3 个答案:

答案 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函数定义”部分。