bash编程中是否有文件范围?

时间:2016-11-01 21:14:28

标签: bash

我想制作这个变量

    local to="$HOME/root_install/grunt"

可用于整个文件

makeGrunt(){

    # set paths
    local to="$HOME/root_install/grunt"
    cd $to

    sudo npm install -g grunt-init
    sudo git clone https://github.com/gruntjs/grunt-init-gruntfile.git ~/.grunt-init/gruntfile
    sudo grunt-init gruntfile
}

2 个答案:

答案 0 :(得分:2)

POSIX类似的shell 中 - 除非您使用非标准构造,例如localtypesetdeclare - < strong>变量隐式通过 分配在手头的shell中有全局范围。

因此,to="$HOME/root_install/grunt"会使当前shell中的变量$to可用任何地方 - 除非您在函数内部并且该变量显式< / em>标记为 local

andlrc's helpful answer演示了与子广告相关的陷阱 - 子广告是克隆的进程原始shell - 他们看到相同的状态,但无法修改原始shell的环境

答案 1 :(得分:1)

Bash shell使用dynamic scopes 这意味着所有变量都可用于所有被调用的函数,命令, 考虑一下:

var=1
a() {
    local var=2
    b
}
b() {
    echo "$var"
}
a # 2
b # 1
a # 2

使用local关键字时,该函数可以使用变量 它定义的地方,也包括从该函数调用的所有函数。

如果创建的变量没有local关键字,则同样适用。同 该异常也将在函数外部提供。

还需要注意的是,每当子shell创建一个变量时 将无法“离开”它,即涉及管道时。考虑一下:

sum=0
seq 3 | while read -r num; do
  sum=$((sum + num))
  echo "$sum" # will print 1, 3 and 6
done
echo "$sum" # 0 huh? 1 + 2 + 3 = 0?