013-在 Shell 脚本中调用另一个 Shell 脚本的三种方式
如下:
- fork: 如果脚本有执行权限的话,
path/to/foo.sh
。如果没有,sh path/to/foo.sh
。 - exec:
exec path/to/foo.sh
- source:
source path/to/foo.sh
1、fork
fork 是最普通的, 就是直接在脚本里面用 path/to/foo.sh 来调用
foo.sh 这个脚本,比如如果是 foo.sh 在当前目录下,就是 ./foo.sh。运行的时候 terminal 会新开一个子 Shell 执行脚本 foo.sh,子 Shell 执行的时候, 父 Shell 还在。子 Shell 执行完毕后返回父 Shell。 子 Shell 从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回父 Shell。
2、exec
exec
与 fork
不同,不需要新开一个子 Shell 来执行被调用的脚本. 被调用的脚本与父脚本在同一个 Shell 内执行。但是使用 exec
调用一个新脚本以后, 父脚本中 exec
行之后的内容就不会再执行了。这是 exec
和 source
的区别.
3、source
与 fork
的区别是不新开一个子 Shell 来执行被调用的脚本,而是在同一个 Shell 中执行. 所以被调用的脚本中声明的变量和环境变量, 都可以在主脚本中进行获取和使用。
测试
脚本1、父脚本
#!/usr/bin/env bash A= echo "执行调用之前进程Id exec/source/fork: PID for 1.sh = $$" export A
echo "In 1.sh: variable A=$A" case $ in
--exec)
echo -e "==> using exec…\n"
exec ./.sh ;;
--source)
echo -e "==> using source…\n"
. ./.sh ;;
*)
echo -e "==> using fork by default…\n"
./.sh ;;
esac echo "执行调用之后进程Id exec/source/fork: PID for 1.sh = $$"
echo -e "父脚本1.sh: variable A=$A\n"
脚本2、子脚本
#!/usr/bin/env bash echo "子脚本2PID for 2.sh = $$"
echo "In 2.sh get variable A=$A from 1.sh" A=
export A echo -e "子脚本2.sh默认A=2: variable A=$A\n"
测试一、fork方式,直接调用
$ ./1.sh
执行调用之前进程Id exec/source/fork: PID for .sh =
In .sh: variable A=
==> using fork by default… 子脚本2PID for .sh =
In .sh get variable A= from .sh
子脚本2.sh默认A=: variable A= 执行调用之后进程Id exec/source/fork: PID for .sh =
In .sh: variable A=
fork
方式可以看出,两个脚本都执行了,运行顺序为1-2-1,从两者的PID值(1.sh PID=71145, 2.sh PID=71146),可以看出,两个脚本是分成两个进程运行的。
测试二、exec方式:./1.sh exec
$ ./1.sh exec
执行调用之前进程Id exec/source/fork: PID for .sh =
In .sh: variable A=
==> using exec… 子脚本2PID for .sh =
In .sh get variable A= from .sh
子脚本2.sh默认A=: variable A=
exec
方式运行的结果是,2.sh 执行完成后,不再回到 1.sh。运行顺序为 1-2。从pid值看,两者是在同一进程 PID=71288 中运行的。
测试三、source方式:./1.sh source
$ ./1.sh source
执行调用之前进程Id exec/source/fork: PID for .sh =
In .sh: variable A=
==> using source… 子脚本2PID for .sh =
In .sh get variable A= from .sh
子脚本2.sh默认A=: variable A= 执行调用之后进程Id exec/source/fork: PID for .sh =
父脚本1.sh: variable A=
source方式的结果是两者在同一进程里运行。该方式相当于把两个脚本先合并再运行。
对比
Command | 进程 | 变量 | Explanation |
---|---|---|---|
fork | 父子不同进程 | 子继承父变量,子不能传递给父 |
新开一个子 Shell 执行,当子进程执行完毕后会返回父进程,但是父进程的环境变量不会因子进程的改变而改变。 子 Shell 可以从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回给父 Shell。 |
exec | 同进程 | 子继承父,子进程结束 | 在同一个 Shell 内执行,但是父脚本中 exec 行之后的内容就不会再执行了,相当于父脚本执行exec进入子脚本后不再回到父脚本。 |
source | 同进程 | 子继承父变量,子同时回传给父 | 在同一个 Shell 中执行,在被调用的脚本中声明的变量和环境变量, 都可以在主脚本中进行获取和使用,相当于合并两个脚本在执行。 |
脚本地址:https://github.com/bjlhx15/shell.git 下的test/invokesh
013-在 Shell 脚本中调用另一个 Shell 脚本的三种方式的更多相关文章
- Shell 脚本中调用另一个 Shell 脚本的三种方式
主要以下有几种方式: Command Explanation fork 新开一个子 Shell 执行,子 Shell 可以从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回给父 ...
- 在一个JSP页面中包含另一个JSP页面的三种方式
转载自://http://blog.163.com/neu_lxb/blog/static/179417010201121343132918/ (1)include指令 includ ...
- 在一个py脚本中调用另外一个py脚本中的类或函数
1.两个文件在同一目录,直接import即可 2.两个文件在不同目录 在导入文件的时候,Python只搜索当前脚本所在的目录,加载(entry-point)入口脚本运行目录和sys.path中包含的路 ...
- shell脚本中执行另一个shell脚本
分类: 可以在一个shell脚本中执行另一个shell脚本(或非可执行文件,主要用于取得一些变量的值),方法是: . 文件名(包括路径) 或 变量=文件名(包括路径) . $变量 注意,圆点后面有 ...
- ASP.NET MVC中使用Unity进行依赖注入的三种方式
在ASP.NET MVC中使用Unity进行依赖注入的三种方式 2013-12-15 21:07 by 小白哥哥, 146 阅读, 0 评论, 收藏, 编辑 在ASP.NET MVC4中,为了在解开C ...
- Shell脚本中调用另外一个脚本的方法
(转载): 在Linux平台上开发,经常会在console(控制台)上执行另外一个脚本文件,经常用的方法有:./my.sh 或 source my.sh 或 . my.sh:这三种方法有什么不同呢?我 ...
- Mybatis-plus中如何排除非表字段的三种方式
1.transient关键字 2.使用静态变量(static) 3.TableField(exit=false) 这三种方式可以在使用的过程中,是这个对象中的属性不被序列化.(直接被忽略)
- shell脚本中调用另一个脚本的三种不同方法(fork, exec, source)
fork ( /directory/script.sh) fork是最普通的, 就是直接在脚本里面用/directory/script.sh来调用script.sh这个脚本. 运行的时候开一个sub- ...
- 在shell脚本中调用另一个脚本的三种不同方法(fork, exec, source)——转载
原文链接:http://blog.chinaunix.net/uid-22548820-id-3181798.html fork ( /directory/script.sh) :如果shell中包含 ...
随机推荐
- 自已编译openweb docker image笔记
1.基于https://github.com/jketterl/openwebrx git clone https://github.com/jketterl/openwebrx.git 2.首先创建 ...
- python编程之字符bytes转换str问题
之前学习bytes转换str的时候,场景比较简单,这次是python中使用subprocess模块输出Linux下的执行命令的结果,默认是bytes类型,因此输出的结果并不是我们想要的,bytes的输 ...
- Python使用request包请求网页乱码解决方法
使用requests请求网页时,返回的页面信息有时是乱码,如下代码 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) App ...
- 手写简单的php生成Html网页
这个是基本功,以前用到laravel及thinkphp时,这一步,都被设置好了吧. 这里只依靠纯的php环境,而没有任何框架, 而框架,只是将这一切规范化,加快代码效率及减小沟通成本,维护升级也方便, ...
- Java实现行列式计算
前天我看线代书,看到行列式,发现是个递归的式子,恰巧又正在学java,产生写程序实现的想法.写了两个小时,觉得实现了,写了个行列式放进去测试,我放的是 这个行列式,经过程序计算后发现结果是0.我以为我 ...
- SpringMVC的全局异常处理
@ControllerAdvice的使用 我们都知道做项目一般都会有全局异常统一处理的类,那么这个类在Spring中可以用@ControllerAdvice来实现. @ControllerAdvice ...
- 与你一起学习MS Project——基础篇:Project基础应用
为了更清晰容易地熟悉掌握Project的基础应用,我们在基础篇中一起来学习掌握在Project中如何做进度计划.资源计划.成本计划以及跟踪项目的执行情况并生成所需的项目报表. 一.进度计划 这里,首先 ...
- 学习Microsoft Visio(3)
流程图的规范及技巧 一.流程图绘制基本要求 二.流程图绘制规范要点 在进行流程图的绘制过程中,要有一条明晰的流程主线,从而使得流程图脉络更加清晰. 通常来讲,流程图要以开始任务为起点,完成任务为终点. ...
- 基于C+OpenCV4.0的LineSegmentDetector算法实现
简单记录LSD算法的实现过程,当做备忘录用,如有问题欢迎指出和讨论 LSD的基本实现流程是计算出图像的梯度和场方向,然后对梯度进行排序,然后从大到小进行区域增长,之后对增长得到的区域求最小外接矩形,如 ...
- HTML事件(onclick、onmouseover、onmouseout、this)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...