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 条评论