加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – shell级别的可变范围

发布时间:2020-12-14 01:18:35 所属栏目:Linux 来源:网络整理
导读:最近我一直在阅读 The Advanced Bash Script ,我发现一些关于父壳和子壳之间的变量范围的东西让我非常困惑.这里是: 现场: 有一些方法可以生成子shell: 首先,(命令列表); 第二,执行非内置命令或脚本,依此类推. 因为当我们在父脚本中运行脚本时,子脚本无法
最近我一直在阅读 The Advanced Bash Script,我发现一些关于父壳和子壳之间的变量范围的东西让我非常困惑.这里是:

现场:
有一些方法可以生成子shell:
首先,(命令列表);
第二,执行非内置命令或脚本,依此类推.

因为当我们在父脚本中运行脚本时,子脚本无法在父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个.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读