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

gav*_*koa 59 bash

例如: Bash-Prog-Intro-HOWTO

function foo() {}

我进行搜索查询info bash并查看POSIX的相关章节中的函数关键字,但没有找到.

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

Eug*_*ash 72

function在Bash中定义函数时,关键字是可选的,如手册中所述:

使用以下语法声明函数:

name () compound-command [ redirections ]

要么

function name [()] compound-command [ redirections ]

语法的第一种形式通常是首选,因为它与Bourne/Korn/POSIX脚本兼容,因此更具可移植性.
也就是说,有时您可能希望使用function关键字来防止Bash 别名与您的函数名称冲突.考虑这个例子:

$ alias foo="echo hi"
$ foo() { :; }
bash: syntax error near unexpected token `('
Run Code Online (Sandbox Code Playgroud)

这里,'foo'由同名别名的文本替换,因为它是命令的第一个单词.随着function别名未展开:

 $ function foo() { :; }
Run Code Online (Sandbox Code Playgroud)

  • @gavenkoa [是](http://en.wikipedia.org/wiki/Bash_%28Unix_shell%29).使用'function'关键字时,Bash函数声明与Bourne/Korn/POSIX脚本不兼容. (9认同)
  • 这个关键字是*NON*-POSIX? (5认同)
  • 如果你不关心 Bourne/Korn/POSIX 脚本,你应该用 `function function_name` 声明 bash 函数 (2认同)

New*_*onx 61

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.
Run Code Online (Sandbox Code Playgroud)

使用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.
Run Code Online (Sandbox Code Playgroud)


a'r*_*a'r 8

保留字function是可选的.请参阅bash手册页中的"Shell函数定义"部分.

  • @gavenkoa是的. (2认同)