What are the parentheses used for in a bash shell script function definition like “f () {}”? Is it different than using the “function” keyword?

谁都会走 提交于 2019-12-31 10:18:11

问题


I'v always wondered what they're used for? Seems silly to put them in every time if you can never put anything inside them.

function_name () {
    #statements
}

Also is there anything to gain/lose with putting the function keyword at the start of a function?

function function_name () {
    #statements
}

回答1:


The keyword function has been deprecated in favor of function_name() for portability with the POSIX spec

A function is a user-defined name that is used as a simple command to call a compound command with new positional parameters. A function is defined with a "function definition command".

The format of a function definition command is as follows:

fname() compound-command[io-redirect ...]

Note that the { } are not mandatory so if you're not going to use the keyword function (and you shouldn't) then the () are necessary so the parser knows you're defining a function.

Example, this is a legal function definition and invocation:

$ myfunc() for arg; do echo "$arg"; done; myfunc foo bar
foo
bar



回答2:


The empty parentheses are required in your first example so that bash knows it's a function definition (otherwise it looks like an ordinary command). In the second example, the () is optional because you've used function.




回答3:


Without function, alias expansion happens at definition time. E.g.:

alias a=b
# Gets expanded to "b() { echo c; }" :
a() { echo c; }
b
# => c
# Gets expanded to b:
a
# => c

With function however, alias expansion does not happen at definition time, so the alias "hides" the definition:

alias a=b
function a { echo c; }
b
# => command not found
# Gets expanded to b:
a
# => command not found
unalias a
a
# => c


来源:https://stackoverflow.com/questions/4654700/what-are-the-parentheses-used-for-in-a-bash-shell-script-function-definition-lik

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!