Bash。可变的可见性和寿命

Bash. Variable visibility and lifetime

我在bash方面没有经验,遇到过一个让我很困惑的案例。这是这种情况的一个例子:

f1()
{
  ar+=(1)
  ar+=(3)
  ar+=(2)
  var="var value"
  echo "0"
}

f2()
{

   res=$(f1)
   echo -------point 1--------
   for i in ${ar[@]}; do
       echo "El $i"
   done
   echo $var

   echo -------point 2--------
   f1>/dev/null
   for i in ${ar[@]}; do
       echo "El $i"
   done
   echo $var
}

f2

此脚本产生以下结果:

-------point 1--------

-------point 2--------
El 1
El 3
El 2
var value

如您所见,函数 f1 以两种不同的方式被调用,它们给出了截然不同的含义。在第一次调用中,在 f1 中声明的数组和变量显然被破坏了。 在第二种方式中,数组和变量被保存。

有没有人可以向我解释一下或者给我一份 link 合适的手册?

当你这样做时:

res=$(f1)

您创建一个子shell,在子shell 中执行f1 并将输出存储到变量$res。在该子shell 中创建的任何变量在它关闭后都会丢失。

当你这样做时:

f1>/dev/null

您在当前 shell 内执行 f1。在函数内创建的变量在全局范围内,因此可以随后访问。