【发布时间】:2017-01-20 18:26:12
【问题描述】:
编者注:
也许以下内容来自 OP 自己的回答,更好地说明了令人惊讶的行为:f() { local b=1; g; echo $b; }; g() { b=2; }; f # -> '2'
即,g() 能够修改 f() 的 local $b 变量。
在 Zsh 和 Bash 中,如果我在运行 f 时具有以下函数 f() { a=1; g; echo $a; } 和以下函数 g() { a=2; },则会得到以下输出而不是预期的输出:
$ f
2
有没有办法禁用这个变量从函数到函数的溢出?
我正在编写一个相当大且重要的 bash/zsh 脚本,该脚本在各种函数中使用了大量变量;其中许多函数依赖于一个更大的主函数,但是由于变量通过一些相当不幸和意外的行为和错误出现在最前沿,使我无法自信地进一步开发,因为我想先解决这个奇怪的问题.
我什至尝试使用local 来本地化变量,但效果仍然存在。
编辑:请注意,我的问题不是关于如何使用局部变量来防止变量泄漏,也不是关于局部变量如何工作、如何设置局部变量、如何为已声明的局部变量分配新值,或者任何废话:它是关于如何防止变量渗入调用者/被调用函数的范围。
【问题讨论】:
-
@Inian,也许吧,但我的问题实际上与为变量赋予新值没有任何关系,而是保留旧值。我查看了您链接的问题中接受的答案和实际问题,但它们似乎并没有真正解决我的问题。