【问题标题】:What is the 'function' keyword used in some bash scripts?某些 bash 脚本中使用的“function”关键字是什么?
【发布时间】:2011-12-16 13:13:20
【问题描述】:

例如: Bash-Prog-Intro-HOWTO

函数 foo() {}

我在info bash 中进行搜索查询,并在 POSIX 的相关章节中查找 function 关键字,但没有找到。

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

【问题讨论】:

    标签: bash


    【解决方案1】:

    function 关键字在 Bash 中定义函数时是可选的,如 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() { :; }
    

    【讨论】:

    • @gavenkoa Yes。使用 'function' 关键字时,Bash 函数声明与 Bourne/Korn/POSIX 脚本不兼容。
    • 请注意,在 Korn shell 中,typedef'ed 变量的范围在两种声明函数的方式之间存在差异(因为范围变量不是 POSIX)。
    • 您如何区分对foo 别名和foo 函数的调用?
    • @AaronFranke 您可以使用内置的type,例如type -a foo.
    • 如果你不关心 Bourne/Korn/POSIX 脚本,你应该用function function_name声明bash函数
    【解决方案2】:

    在函数名也是别名的极少数情况下,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.
    

    【讨论】:

      【解决方案3】:

      保留字function 是可选的。请参阅bash man page 中的“Shell 函数定义”部分。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-04
        • 1970-01-01
        • 1970-01-01
        • 2011-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多