该脚本演示了定义的带括号括号诗句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
是的,语法是允许的。 正如所描述的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
两者都是有效的,并且如所提到卡尔也可以使用的任何化合物的命令 ,例如:
$ 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环境”得到执行。