linux – shell级别的可变范围
最近我一直在阅读
The Advanced Bash Script,我发现一些关于父壳和子壳之间的变量范围的东西让我非常困惑.这里是:
现场: 因为当我们在父脚本中运行脚本时,子脚本无法在父shell中看到变量.为什么在(命令列表)结构中子shell可以看到父shell中的变量. >(命令列表) $a=100 $(echo $a) 100 $ >运行一个脚本 $cat b.sh echo $a $a=100 $./b.sh # empty 怎么样? 解决方法
如果您在原始脚本中运行了子shell:
(command1; command2; ...) 子shell是fork()创建的原始shell的直接副本,因此可以直接访问其自己可用的所有原始变量的副本. 假设子shell中的命令(command1,command2等)本身就是shell脚本.这些命令由子shell调用fork()然后exec()执行以创建新shell,新shell不会从原始shell继承未导出的变量. 直接解决您的示例: $a=100 $(echo $a) 100 $ 这里,子shell有自己的所有变量(特别是a)的副本,父变量可以访问它们.当然,子shell中所做的任何更改都不会反映在父shell中,因此: $a=100 $(echo $a; a=200; echo $a) 100 200 $echo $a 100 $ 现在你的第二个例子: $cat b.sh echo $a $a=100 $./b.sh $. ./b.sh 100 $source ./b.sh 100 $a=200 ./b.sh 200 $echo $a 100 $export a $./b.sh 100 $ 变量a未导出,因此第一次运行b.sh时,它没有$a的值,因此它回显一个空行.第二个例子是’作弊’; shell读取脚本b.sh,就好像它是当前shell的一部分(没有fork())所以变量仍然可以被b.sh访问,因此它每次都回显100. (Dot或.是在当前shell中读取脚本的旧机制;第7版UNIX中的Bourne shell使用它.源命令是从C shell中借用的等效机制.) 命令a = 200 ./b.sh在命令的持续时间内导出a,因此b.sh看到并回显修改后的值200,但主shell没有变化.然后当a导出时,它可以自动用于b.sh,因此它可以看到并回显最后100个. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |