执行一个shell脚本会在当前shell中派生一个子shell去执行任务。同理,如果一个shell脚本中调用另一个shell,也是会在执行到子shell这一步的时候再次派生一个子shell去处理脚本。例如a.sh脚本有如下信息:
[code="bash"]
#!/bin/bash
echo $$
./b.sh
[/code]
b.sh中有:
[code="bash"]
#!/bin/bash
echo $$
[/code]
执行a.sh会发现输出两行不同的进程ID,验证了每个sh在执行的时候会派生一个子shell去执行任务。
在脚本之间调用我们或许会遇到变量之间的调用关系,这里我们需要注意一下几个场景的应用:
场景1, 当前shell中创建一个变量传递给当前脚本派生的子shell,例如:
a.sh
[code="bash"]
#!/bin/bash
a="TEST"
./b.sh
[/code]
b.sh
[code="bash"]
#!/bin/bash
echo $a
[/code]
这时会发现在b.sh中是无法正常获取到a的变量值的,那么我们可以利用export命令或者set -a命令来使当前shell的变量激活到派生的子shell中。
我们只需要在a.sh中加入
[code="bash"]
#!/bin/bash
export a="TEST"
[/code]
或者
[code="bash"]
#!/bin/bash
set -a
a="TEST"
[/code]
场景2,派生的子shell中的变量在当前父shell中使用,例如:
a.sh
[code="bash"]
#!/bin/bash
./b.sh
echo $b
[/code]
b.sh
[code="bash"]
#!/bin/bash
b="TEST"
[/code]
我们来执行a.sh会发现输出的b变量为空。那么我们可以使用source命令或者.(点号)来激活子shell中的变量使其能在父shell中使用。
我们只需要修改a.sh,在调用b.sh前加上特殊命令或字符即可,例如:
[code="bash"]
#!/bin/bash
. ./b.sh
#或者
source ./b.sh
[/code]