• Ukieweb

    佳的博客

    曾梦想仗剑天涯,后来工作忙没去。

Linux shell脚本中调用外部另一个shell脚本(exec、source、fork)方法讲解

在运行shell脚本时候,有三种方式来调用外部的脚本,exec(exec script.sh)、source(source script.sh)、fork(./script.sh)

1、exec(exec /home/script.sh):

  • 使用exec来调用脚本,被执行的脚本继承当前shell的环境变量。不继承用户声明变量(用户定义的变量)

  • exec产生了新的进程,他会把主shell的进程资源占用并替换脚本内容,继承了原主shell的PID号

  • 被调脚本执行完就over了,原主shell剩下的内容不会执行

2、source(source /home/script.sh)

  • 使用source或者“.”来调用外部脚本,继承当前shell环境变量继承用户声明的变量

  • 不会产生新的进程,

  • 被调脚本对继承的主脚本的环境变量、声明变量的更改,会回传给主脚本。

  • 被调脚本中定义的环境变量和声明变量,会回传(污染)给主脚本

3、fork(/home/script.sh)

  • 直接运行脚本,继承主脚本的环境变量,不继承声明变量

  • 会以当前shell为父进程,产生新的进程,

  • 被调脚本对继承的主脚本的环境变量、声明变量的更改,不会回传主脚本。

  • 被调脚本中定义的环境变量和声明变量,不会回传(污染)主脚本

总结:

  • fork:只继承主脚本环境变量,不会污染主脚本

  • source:继承所有变量,对主脚本污染严重

  • exec:神经病命令

export 的说明

export可新增,修改或删除环境变量,供后续执行的程序使用。同时,重要的一点是,export的效力仅及于该次登陆操作。注销或者重新开一个窗口,export命令给出的环境变量都不存在了。

4、测试脚本:

主脚本 main.sh

#!/bin/sh
export AA="EVN-AA"
aa="var-aa"
echo "主脚本环境变量 AA 为: $AA"
echo "主脚本声明变量 aa 为: $aa"
echo "主脚本PID为:$$"
case $1 in
  exec)
    echo "使用 exec 方式执行被调脚本"
    exec ./2.sh ;;
  source)
    echo "使用 source 方式执行被调脚本"
    source ./2.sh ;;
  *)
    echo "使用 fork 方式执行被调脚本"
    ./2.sh ;;
esac
echo "执行脚本 2.sh 后主脚本 PID 为 :$$"
echo "现在主脚本环境变量 AA 为: $AA"
echo "现在主脚本声明变量 aa 为: $aa"
echo "从被调脚本获取环境变量 BB 为:$BB"
echo "从被调脚本获取声明变量bb:$bb"

调用脚本2.sh

 #!/bin/sh
 echo -e "\n\n\n被调脚本 2.sh PID 为:$$"
 
 echo  "被调脚本从主脚本获取环境变量 AA 的值为: $AA"
 echo  "被调脚本从主脚本获取声明变量 aa 的值为: $aa"
 AA="ENV-22"
 aa="var-22"
 export BB="ENV-BB"
 bb="var-bb"

 
 echo "被调脚本重新赋值主脚本环境变量 AA 后: $AA"
 echo -e "被调脚本重新赋值主脚本声明变量 aa 后: $aa\n\n\n"

执行结果:

[root@lvs2 home]# ./main.sh exec
主脚本环境变量 AA 为: EVN-AA
主脚本声明变量 aa 为: var-aa
主脚本PID为:15311
使用 exec 方式执行被调脚本

被调脚本 2.sh PID 为:15311
被调脚本从主脚本获取环境变量 AA 的值为: EVN-AA
被调脚本从主脚本获取声明变量 aa 的值为: 
被调脚本重新赋值主脚本环境变量 AA 后: ENV-22
被调脚本重新赋值主脚本声明变量 aa 后: var-22




[root@lvs2 home]# ./main.sh source
主脚本环境变量 AA 为: EVN-AA
主脚本声明变量 aa 为: var-aa
主脚本PID为:15517
使用 source 方式执行被调脚本

被调脚本 2.sh PID 为:15517
被调脚本从主脚本获取环境变量 AA 的值为: EVN-AA
被调脚本从主脚本获取声明变量 aa 的值为: var-aa
被调脚本重新赋值主脚本环境变量 AA 后: ENV-22
被调脚本重新赋值主脚本声明变量 aa 后: var-22

执行脚本 2.sh 后主脚本 PID 为 :15517
现在主脚本环境变量 AA 为: ENV-22
现在主脚本声明变量 aa 为: var-22
从被调脚本获取环境变量 BB 为:ENV-BB
从被调脚本获取声明变量bb:var-bb

[root@lvs2 home]# ./main.sh fork
主脚本环境变量 AA 为: EVN-AA
主脚本声明变量 aa 为: var-aa
主脚本PID为:15642
使用 fork 方式执行被调脚本

被调脚本 2.sh PID 为:15643
被调脚本从主脚本获取环境变量 AA 的值为: EVN-AA
被调脚本从主脚本获取声明变量 aa 的值为: 
被调脚本重新赋值主脚本环境变量 AA 后: ENV-22
被调脚本重新赋值主脚本声明变量 aa 后: var-22

执行脚本 2.sh 后主脚本 PID 为 :15642
现在主脚本环境变量 AA 为: EVN-AA
现在主脚本声明变量 aa 为: var-aa
从被调脚本获取环境变量 BB 为:
从被调脚本获取声明变量bb:




0
0
下一篇:node.js 和 npm的 镜像源的修改

0 条评论

老佳啊

85后,大专学历,中原人士,家里没矿。

由于年轻时长的比较帅气,导致在别人眼里,我一直不谈恋爱的原因是清高,实则是自己的小自卑。最大的人生目标就是找一个相知相爱相容的人,共度余生。

和人相处时如果能感受到真诚,会非常注重彼此的关系,对别人没有什么心机,即使有利益冲突,一般也会以和为贵,因为在这个世界上,物质的东西,从来不会吸引到我。

特别迷恋那些大山大水,如果现在还能隐居,可能早就去了。对那些宏伟的有底蕴的人文景观比较不感冒。

从事于IT行业,却一直对厨房念念不忘,由于身材魁梧,总觉得自己上辈子是个将军,可惜这辈子没当兵,也不会打架。