【Shell】Shell脚本中调用另一个脚本的三种方式(fork/exec/source)
先来说一下主要以下有几种方式:
(1)fork: 如果脚本有执行权限的话,path/to/foo.sh。如果没有,sh path/to/foo.sh。
(2)exec: exec path/to/foo.sh
(3)source: source path/to/foo.sh
- fork
fork 是最普通的, 就是直接在脚本里面用 path/to/foo.sh 来调用 foo.sh 这个脚本,比如如果是 foo.sh 在当前目录下,就是 ./foo.sh。运行的时候 terminal 会新开一个子 Shell 执行脚本 foo.sh,子 Shell 执行的时候, 父 Shell 还在。子 Shell 执行完毕后返回父 Shell。 子 Shell 从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回父 Shell。 - exec
exec 与 fork 不同,不需要新开一个子 Shell 来执行被调用的脚本. 被调用的脚本与父脚本在同一个 Shell 内执行。但是使用 exec 调用一个新脚本以后, 父脚本中 exec 行之后的内容就不会再执行了。这是 exec 和 source 的区别. - source
与 fork 的区别是不新开一个子 Shell 来执行被调用的脚本,而是在同一个 Shell 中执行. 所以被调用的脚本中声明的变量和环境变量, 都可以在主脚本中进行获取和使用。
其实从命名上可以感知到其中的细微区别,下面通过两个脚本来体会三种调用方式的不同:
第一个脚本,我们命名为 1.sh:
#!/usr/bin/env bash
A=1
echo "before exec/source/fork: PID for 1.sh = $$"
export A
echo "In 1.sh: variable A=$A"
case $1 in--exec)echo -e "==> using exec…\n"exec ./2.sh ;;--source)echo -e "==> using source…\n". ./2.sh ;;*)echo -e "==> using fork by default…\n"./2.sh ;;
esac
echo "after exec/source/fork: PID for 1.sh = $$"
echo -e "In 1.sh: variable A=$A\n"
第二个脚本,我们命名为 2.sh:
#!/usr/bin/env bash
echo "PID for 2.sh = $$"
echo "In 2.sh get variable A=$A from 1.sh"
A=2
export A
echo -e "In 2.sh: variable A=$A\n"
注:这两个脚本中的参数 $$ 用于返回脚本的 PID , 也就是进程 ID。这个例子是想通过显示 PID 判断两个脚本是分开执行还是同一进程里执行,也就是是否有新开子 Shell。当执行完脚本 2.sh 后,脚本 1.sh 后面的内容是否还执行。
fork
fork 方式可以看出,两个脚本都执行了,运行顺序为1-2-1,从两者的PID值(1.sh PID=82266, 2.sh PID=82267),可以看出,两个脚本是分成两个进程运行的。
exec
exec 方式运行的结果是,2.sh 执行完成后,不再回到 1.sh。运行顺序为 1-2。从pid值看,两者是在同一进程 PID=82287 中运行的。
source
source方式的结果是两者在同一进程里运行。该方式相当于把两个脚本先合并再运行。
总结
【Shell】Shell脚本中调用另一个脚本的三种方式(fork/exec/source)相关推荐
- shell实例第19讲:一个脚本中调用另一个脚本的3种方法
在Shell脚本中调用另一个脚本(3种方法) 准备:主脚本是second.sh,主脚本中调用first.sh 方法1:exec(1)执行方式:exec /home/weibo/shell_test/s ...
- 【linux】Shell脚本中调用另外一个脚本的方法
在Linux平台上开发,经常会在console(控制台)上执行另外一个脚本文件,经常用的方法有:./my.sh 或 source my.sh 或 . my.sh:这三种方法有什么不同呢?我们先来了解一 ...
- linux fork脚本,在Shell脚本中调用另一个脚本的三种方式讲解
先来说一下主要以下有几种方式: fork: 如果脚本有执行权限的话,path/to/foo.sh.如果没有,sh path/to/foo.sh. exec: exec path/to/foo.sh s ...
- unity 脚本中 调用另一个脚本_Unity 2019.4 脚本生命周期
脚本生命周期流程图 加载第一个场景 场景开始时将调用以下函数(为场景中的每个对象调用一次). Awake:始终在任何 Start 函数之前并在实例化预制件之后调用此函数.(如果游戏对象在启动期间处于非 ...
- linux fork脚本,shell调度脚本的三种不同方法(fork, exec, source)
fork:/dir/script.sh fork是最普通的, 就是直接在脚本里面用/dir/script.sh来调用script.sh这个脚本.运行的时候开一个sub-shell执行调用的脚本,sub ...
- 在 Shell 脚本中调用另一个 Shell 脚本的三种方式
先来说一下主要以下有几种方式: fork: 如果脚本有执行权限的话,path/to/foo.sh.如果没有,sh path/to/foo.sh. exec: exec path/to/foo.sh s ...
- linux exec 脚本之家,详解Shell脚本中调用另一个Shell脚本的三种方式
主要以下有几种方式: Command Explanation fork 新开一个子 Shell 执行,子 Shell 可以从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回给父 ...
- 【Groovy】Groovy 脚本调用 ( Groovy 脚本中调用另外一个 Groovy 脚本 | 调用 evaluate 方法执行 Groovy 脚本 | 参数传递 )
文章目录 一.Groovy 脚本中调用另外一个 Groovy 脚本 1.调用 evaluate 方法执行 Groovy 脚本 2.参数传递 二.完整代码示例 1.调用者 Groovy 脚本 2.被调用 ...
- vue 函数 路由跳转_vue中通过路由跳转的三种方式
router-view 实现路由内容的地方,引入组件时写到需要引入的地方 需要注意的是,使用vue-router控制路由则必须router-view作为容器. 通过路由跳转的三种方式 1.router ...
最新文章
- asp.net oracle优化,[转]ASP.NET性能优化
- 【Deep Learning】Tensorflow实现逻辑回归
- html5 Canvas画图教程(5)—canvas里画曲线之arc方法
- Linux内核链表深度分析【转】
- 流行病学数据分析基础:识别和控制混杂
- Android USB转串口开发(hoho.android.usbserial串口库)
- C语言中指针的初始化和赋值
- 底量超顶量超级大黑马指标源码_底量超顶量+地量买点_月线底量超顶量大牛股,底量超顶量超级大黑马,底量超顶量买入指标,后量超前量买入指标_指标公式分享交流论坛_理想论坛 - 股票论坛...
- c语言数据结构 字符串,C++数据结构之字符串操作
- java 创建进程_Linux下创建进程简介
- 库管小帮手服务器修复,文达库管小帮手
- 使用C#语言,从Excel2007中读取数据,并显示到Form中的DataGridView。
- canvas实现点连线动画
- 自动点击android按钮,Android实现自动点击无障碍服务功能的实例代码
- 北卡罗来纳州立大学计算机科学,北卡罗来纳州立大学计算机科学理学硕士研究生申请要求及申请材料要求清单...
- [转]杀毒软件的引擎
- PostgreSQL AUTO INCREMENT(自动增长)
- AMD首批Zen4架构CPU,连低端R5单核性能都超英特尔旗舰,最高降价700元
- JS前端数据多条件筛选
- 1-编程基础及Python环境部署
热门文章
- 【Paper】2022_Fixed-Time Cooperative Tracking for Delayed Disturbed Multi-Agent Systems Under Dynamic
- 和求余运算巧妙结合的jns指令
- 计算机网络教程网线制作,图吧小白教程 篇二十六:手把手教你自制网线(夹网线水晶头)...
- redis的持久化机制详解
- 关于计算机学院 公众号的名字,好听的微信公众号名字
- tf1.x error:Variable generator/encoder_image/conv2d/kernel already exists, disallowed
- Mina中的Snark Worker
- html浅色_修改CSS样式实现网页灰色(没有颜色只有浅色黑白)的几个方法整理
- web前端---css基础
- BeanUtils.populate(Object Bean,Map properties)