使用括号,而不是括号的定义bash函数体(Defining bash function body u

2019-07-19 03:09发布

该脚本演示了定义的带括号括号诗句bash函数。 括号具有使在“本地”,我猜是因为函数体作为一个子shell执行的函数创建环境变量的不错的效果。 输出是:

A=something
A=
B=something
B=something

现在的问题是,如果这是允许的语法定义函数。

#!/bin/bash

foo() (
    export A=something
    echo A=$A
)

bar() {
    export B=something
    echo B=$B
}

foo
echo A=$A
bar
echo B=$B

Answer 1:

是的,语法是允许的。 正如所描述的bash手册页 ,bash函数的定义是:

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

一些更多的描述(也从该名男子页):

函数的主体是化合物命令compound-command 。 该命令通常是之间的命令的列表{} ,也可以是下化合物中列出的任何命令上述命令

(){}包围列表是化合物的命令。 完整名单(再次从该名男子页,只需编辑到一个简单的列表):

的化合物的命令是下列之一:

 (list) { list; } ((expression)) [[expression]] for name [ in word ] ; do list ; done for (( expr1 ; expr2 ; expr3 )) ; do list ; done select name [ in word ] ; do list ; done case word in [ [(] pattern [ | pattern ] ... ) list ;; ] ... esac if list; then list; [ elif list; then list; ] ... [ else list; ] fi while list; do list; done until list; do list; done 


Answer 2:

两者都是有效的,并且如所提到卡尔也可以使用的任何化合物的命令 ,例如:

$ f() if [ "$1" = 'a' ]; then echo 'equals a'; fi
$ f a
equals a
$ f b
$

POSIX 7 2.9.5功能定义命令 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_05 :

函数定义命令的格式如下:

FNAME()化合物命令[IO-重定向...]

[...]的参数化合物-命令表示的化合物的命令,如将化合物命令中所述。

然后2.9.4复合命令 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_04 :

(化合物名单)[...]影响环境变量赋值,并内置命令不得名单后结束仍然有效。

{化合物列表;}在当前过程环境执行化合物列表。

语义是相同的使用()没有一个函数定义:它不创建一个新的进程,但在什么POSIX和Bash叫“子shell环境”得到执行。



文章来源: Defining bash function body using parenthesis instead of braces