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的值.
我是否需要更正维基百科条目,或调整我的理解?
Bash 变量使用动态作用域,就像您提到的 wiki 页面中一样。
使用动态作用域的语言示例包括 Logo、Emacs Lisp 以及 shell 语言bash、dash 和 PowerShell。
动态作用域相当容易实现。为了找到标识符的值,程序可以遍历运行时堆栈,检查每个激活记录(每个函数的堆栈帧)以查找标识符的值。
Bash 自己的手册是这样说的:
shell 使用动态作用域来控制函数内变量的可见性。通过动态作用域,可见变量及其值是导致执行到达当前函数的函数调用序列的结果。函数看到的变量的值取决于其调用者(如果有)内的值,无论该调用者是“全局”作用域还是另一个 shell 函数。这也是局部变量声明“隐藏”的值,以及函数返回时恢复的值。
例如,如果一个变量
var在 function 中声明为局部 变量func1,并func1调用另一个 functionfunc2,则从var内部进行的引用func2将解析为局部变量varfromfunc1,从而遮蔽任何名为 的全局变量var。
有关如何使用它的信息,请参阅Bash:通过引用传递变量。