在bash中编写`函数名{…;}`、`Name(){…;}`和`函数名(){…;}`之间的区别

在bash中编写`函数名{…;}`、`Name(){…;}`和`函数名(){…;}`之间的区别,bash,function,shell,command-line,Bash,Function,Shell,Command Line,可以通过以下几种方式编写bash函数: function JoinStrings { ...; } 或 或 这些功能之间有什么区别吗?为什么在bash中有3种不同的函数编写方法?(还有更多的编写函数的方法吗?函数名{}与函数名(){}相同。我能想到的function name和name()之间的唯一区别是,如果name是别名,那么name()可能会被别名扩展。例如: [步骤100]#echo$BASH#u版本 4.3.30(1)-发布 [步骤101]#cat func.sh shopt

可以通过以下几种方式编写bash函数:

function JoinStrings {
    ...;
}


这些功能之间有什么区别吗?为什么在bash中有3种不同的函数编写方法?(还有更多的编写函数的方法吗?

函数名{}
函数名(){}
相同。我能想到的
function name
name()
之间的唯一区别是,如果
name
是别名,那么
name()
可能会被别名扩展。例如:

[步骤100]#echo$BASH#u版本
4.3.30(1)-发布
[步骤101]#cat func.sh
shopt-s扩展_别名
别名foo=bar
#这将定义一个名为“foo”的函数
函数foo()
{
echo$FUNCNAME
}
#这将定义一个名为“bar”的函数
foo()
{
echo$FUNCNAME
}
乌那利亚斯福
福
酒吧
[步骤102]#bash func.sh
福
酒吧
[步骤103]#
顺便说一下,在
ksh
中,
函数名{}
name(){}
非常不同。根据ksh手册:

出于历史原因,有两种定义函数的方法
name()

函数名
语法定义并由
名称
执行调用的函数 在与调用者相同的过程中,共享所有文件并显示 调用方的工作目录。来电者捕捉到的陷阱是 重置为函数内的默认操作。陷阱状态 未被函数捕获或忽略的事件会导致函数 终止并将条件传递给调用方。陷阱 函数内的退出集在调用方的环境中执行 函数完成后。通常情况下,变量是共享的 调用程序和函数。然而,这套字体很特别 函数中使用的内置命令定义其 作用域包括当前函数。它们可以传递给函数 在调用之前的变量赋值列表中调用 或作为名称引用传递的参数。函数中的错误 将控件返回给调用方

使用
name()
语法定义的函数和使用
函数名
使用
特殊内置函数调用的语法是 在调用方的环境中执行,并共享所有变量和陷阱 和打电话的人在一起。这些函数执行中的错误会导致 包含要中止的它们的脚本


没有区别。第二种形式(即
函数
()
)非常令人讨厌。至于原因,这只是历史性的(或者我相信是这样),没有更多
func(){}
是POSIX,因此是可移植的;
函数
保留字是bashism。就我个人而言,我会编写
函数
,明确破坏POSIX兼容性,以防止白痴从不兼容的shell(例如dash)中获取资源(但许多仍然会漏掉)。还有其他方法吗?否。RTFM:。
function JoinStrings () {
    ...;
}
JoinStrings () {
    ...;
}