What is the 'function' keyword used in some bash scripts?

前端 未结 3 950
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-11-28 07:05

For example: Bash-Prog-Intro-HOWTO

function foo() {}

I make search queries in info bash and look in releted chapters of POSIX for

相关标签:
3条回答
  • 2020-11-28 07:43

    The reserved word function is optional. See the section 'Shell Function Definitions' in the bash man page.

    0 讨论(0)
  • 2020-11-28 07:48

    The function keyword is necessary in rare cases when the function name is also an alias. Without it, Bash expands the alias before parsing the function definition -- probably not what you want:

    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.
    

    With the function keyword, things work as intended:

    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.
    
    0 讨论(0)
  • 2020-11-28 07:53

    The function keyword is optional when defining a function in Bash, as documented in the manual:

    Functions are declared using this syntax:

    name () compound-command [ redirections ]

    or

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

    The first form of the syntax is generally preferred because it's compatible with Bourne/Korn/POSIX scripts and so more portable.
    That said, sometimes you might want to use the function keyword to prevent Bash aliases from colliding with your function's name. Consider this example:

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

    Here, 'foo' is replaced by the text of the alias of the same name because it's the first word of the command. With function the alias is not expanded:

     $ function foo() { :; }
    
    0 讨论(0)
提交回复
热议问题