在bash中编写`函数名{…;}`、`Name(){…;}`和`函数名(){…;}`之间的区别
可以通过以下几种方式编写bash函数:在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
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 () {
...;
}