我想制作这个变量
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
}
答案 0 :(得分:2)
在 POSIX类似的shell 中 - 除非您使用非标准构造,例如local
,typeset
或declare
- < 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?