考虑以下代码:
zzz=2
function f()
{
zzz=4
}
$(f)
echo $zzz
为什么忽略赋值(zzz=4
)?我以为我知道$( )
是做什么的--它将所有写入标准输出的内容逐字粘贴到使用它的地方。但是为什么这会影响全局变量的赋值呢?
发布于 2019-05-28 23:46:49
为什么你把它叫做subshell呢?
zzz=2
f() { zzz=4; }
$(f) # assigns COPY of zzz, then goes POOF
echo $zzz
f # assigns to zzz
echo $zzz
通过在子subshell中运行它,您可以创建一个子环境,该环境将变量赋值,然后蒸发。
发布于 2019-05-28 23:42:37
另一个正确的答案是,$()
将创建一个子shell,您将拥有独立于父shell的执行环境。
zzz=2
function f()
{
echo zzz=4
}
eval $(f)
echo $zzz
您可以通过使用eval
来解决此问题。首先在函数内部打印所需的赋值语句,然后在调用者代码中计算该语句。
注意:请注意,eval
有一些警告,应该避免,除非您确定您的代码的行为。
发布于 2019-05-29 03:20:09
移除f周围的子壳。
假设您确实没有用到子should,代码应该如下所示:
zzz=2
function f()
{
zzz=4
}
f
echo $zzz
您告诉它函数f需要在不同的shell中执行,所以它不会更改变量。
https://stackoverflow.com/questions/56345587
复制相似问题