相关疑难解决方法(0)

符合POSIX的方法将范围变量扩展到Shell脚本中的函数

是否有POSIX兼容方法将变量的范围限制为声明的函数?即:

Testing()
{
    TEST="testing"
}

Testing
echo "Test is: $TEST"
Run Code Online (Sandbox Code Playgroud)

应打印"测试是:".我已经阅读过declare,local和typeset关键字,但它们看起来并不像POSIX内置函数.

variables shell posix scope function

42
推荐指数
3
解决办法
1万
查看次数

嵌套函数调用中的变量赋值意外地更改了调用者范围中的局部变量

编者注:
也许以下内容取自OP自己的答案,更好地说明了令人惊讶的行为:
f() { local b=1; g; echo $b; }; g() { b=2; }; f # -> '2'
即,g()能够修改f()局部 $b变量.


在岩组和Bash,如果我有以下功能f() { a=1; g; echo $a; }及以下功能g() { a=2; },当我跑f,我得到下面的输出,而不是预期:

$ f
2
Run Code Online (Sandbox Code Playgroud)

无论如何要禁用从函数到函数的这个变量渗透?

我正在研究一个相当大而重要的bash/zsh脚本,它在各种函数中使用了大量的变量; 许多这些功能依赖于更大的主功能,但是由于变量通过一些相当不幸和意外的行为而流失,并且错误已经成为最重要的,阻止我自信地进一步发展,因为我想首先解决这个奇怪的问题.

我甚至尝试使用local本地化变量,但效果仍然存在.

编辑:请注意,我的问题不是关于如何使用局部变量来防止变量渗透或关于局部变量如何工作,如何设置局部变量,如何为已经声明的局部变量分配新值,或者任何一个废话:它是关于如何防止变量渗入调用者/被调用函数的范围.

bash scope zsh function

4
推荐指数
1
解决办法
770
查看次数

标签 统计

function ×2

scope ×2

bash ×1

posix ×1

shell ×1

variables ×1

zsh ×1