理解词汇范围 - 维基百科是否正确?

Edw*_*rdo 5 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
Run Code Online (Sandbox Code Playgroud)

Bash脚本的输出是3,1.然而,在我看来它应该是3,因为函数g打印x的(动态)值然后设置x = 2的值.

我是否需要更正维基百科条目,或调整我的理解?

pyn*_*exj 3

Bash 变量使用动态作用域,就像您提到的 wiki 页面中一样。

使用动态作用域的语言示例包括 Logo、Emacs Lisp 以及 shell 语言bash、dash 和 PowerShell。

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

Bash 自己的手册是这样说的:

shell 使用动态作用域来控制函数内变量的可见性。通过动态作用域,可见变量及其值是导致执行到达当前函数的函数调用序列的结果。函数看到的变量的值取决于其调用者(如果有)内的值,无论该调用者是“全局”作用域还是另一个 shell 函数。这也是局部变量声明“隐藏”的值,以及函数返回时恢复的值。

例如,如果一个变量var在 function 中声明为局部 变量func1,并func1调用另一个 function func2,则从var内部进行的引用func2将解析为局部变量 var from func1,从而遮蔽任何名为 的全局变量var

有关如何使用它的信息,请参阅Bash:通过引用传递变量