Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 理解词汇范围-维基百科正确吗?_Bash_Scope_Lexical Scope - Fatal编程技术网

Bash 理解词汇范围-维基百科正确吗?

Bash 理解词汇范围-维基百科正确吗?,bash,scope,lexical-scope,Bash,Scope,Lexical Scope,我一直在尝试探索词法范围(我对词法这个词的使用还远远没有信服,但这是另一个讨论),我已经研究了 根据相当简单的Bash脚本示例 $ x=1 $ function g () { echo $x ; x=2 ; } $ function f () { local x=3 ; g ; } $ f # does this print 1, or 3? 3 $ echo $x # does this print 1, or 2? 1 Bash脚本的输出是3,1。然而,在我看来,它应该是3,2,因为函数

我一直在尝试探索词法范围(我对词法这个词的使用还远远没有信服,但这是另一个讨论),我已经研究了

根据相当简单的Bash脚本示例

$ x=1 
$ function g () { echo $x ; x=2 ; }
$ function f () { local x=3 ; g ; }
$ f # does this print 1, or 3?
3
$ echo $x # does this print 1, or 2?
1
Bash脚本的输出是3,1。然而,在我看来,它应该是3,2,因为函数g打印x的(动态)值,然后设置x=2的值

我需要更正Wikipedia条目,还是调整我的理解?

Bash vars使用,就像您提到的wiki页面一样

使用动态范围的语言示例包括Logo、Emacs Lisp和shell语言bash、dash和PowerShell

动态作用域相当容易实现。为了找到标识符的值,程序可以遍历运行时堆栈,检查每个激活记录(每个函数的堆栈帧)中的标识符值


有关如何使用此功能,请参见内置(emphasis mine)的
bash
手册页说明中的
local

在函数中使用local时,会导致 变量名的可见范围仅限于该函数及其子函数

调用
g
时,从最近的封闭运行时上下文使用
x
(未标记为
local
)的值。当从
f
调用
g
时,这意味着由
f
定义的局部变量
x
,而不是全局变量
x
。这适用于对
x
的查找和分配。当从全局范围调用
g
时,
x
引用全局变量
x


这与词汇作用域形成对比,在词汇作用域中,函数
g
中的
x
总是指全局
x
,因为
g
是在全局范围内定义的。调用函数的位置不相关。

g
将2分配给函数
f
的本地
x
。当
f
结束时,他的激活记录从堆栈中弹出,然后第二个回音在堆栈中查找并找到开始的
x=1

它将f中的局部变量设置为2,当f结束时,该变量被装箱。在
g之后放置
echo$x
谢谢。这对我来说很清楚。很抱歉打扰你。我希望可以问一下。:)我坐在一个shell程序前面,它几乎不使用动态范围,主要是在函数之间传递数组。变量用于不同的函数和函数组合,这些函数分布在五个源文件中。在我看来,这段代码的可读性/可遵循性较差,而且函数紧密耦合的事实使得它容易出现bug,并且很难维护。你会说这只是shell代码的常规做法,我必须这样想,还是你同意?