猛击。可变的可见性和寿命

Cap*_*nin 2 linux variables bash visibility function

我在 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
Run Code Online (Sandbox Code Playgroud)

此脚本产生以下结果:

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

-------point 2--------
El 1
El 3
El 2
var value
Run Code Online (Sandbox Code Playgroud)

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

有没有人可以向我解释或给我一个适当手册的链接?

Tom*_*ech 5

当你这样做时:

res=$(f1)
Run Code Online (Sandbox Code Playgroud)

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

当你这样做时:

f1>/dev/null
Run Code Online (Sandbox Code Playgroud)

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