先来说一下主要以下有几种方式:

fork: 如果脚本有执行权限的话,path/to/foo.sh。如果没有,sh path/to/foo.sh。

exec: exec path/to/foo.sh

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后面的内容是否还执行。

chmod +x 1.sh 2.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方式的结果是两者在同一进程里运行。该方式相当于把两个脚本先合并再运行。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

linux fork脚本,在Shell脚本中调用另一个脚本的三种方式讲解相关推荐

  1. shell实例第19讲:一个脚本中调用另一个脚本的3种方法

    在Shell脚本中调用另一个脚本(3种方法) 准备:主脚本是second.sh,主脚本中调用first.sh 方法1:exec(1)执行方式:exec /home/weibo/shell_test/s ...

  2. shell 不等于_关于shell编程中的整数值比较的两种方式的简单操作实例

    谈一谈关于shell编程中的整数值比较的两种方式 Shell编程有时处理一个对象时,需要我们对对象进行测试. 只有符合要求的才采取下一步操作,这样做的好处可以避免程序出错. 这个测试的对象可以是文件. ...

  3. vue 函数 路由跳转_vue中通过路由跳转的三种方式

    router-view 实现路由内容的地方,引入组件时写到需要引入的地方 需要注意的是,使用vue-router控制路由则必须router-view作为容器. 通过路由跳转的三种方式 1.router ...

  4. Python找出列表中出现次数最多的元素三种方式

    通过三种方式给大家介绍,具体详情如下所示: 方式一: 原理:创建一个新的空字典,用循环的方式来获取列表中的每一个元素,判断获取的元素是否存在字典中的key,如果不存在的话,将元素作为key,值为列表中 ...

  5. vue中实现路由跳转的三种方式(超详细整理)

    vue中实现路由跳转的三种方式 一.使用vue-router vue-router 本质是一个第三方的包 用的时候需要下载 步骤 (7步法 ): 下载vue-router模块到当前工程 yarn ad ...

  6. Action 中获取表单数据的三种方式

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/53138905  冷血之心的博客) Action 中获取表单提交数据 ...

  7. Winform中通过NPOI导出Excel的三种方式(HSSFWorkbook,XSSFWorkbook,SXSSFWorkbook)附代码下载

    场景 HSSFworkbook,XSSFworkbook,SXSSFworkbook区别 HSSFWorkbook: 是操作Excel2003以前(包括2003)的版本,扩展名是.xls:导出exce ...

  8. html如何给3种渐变色,css中颜色渐变的实现(三种方式)

    本篇文章给大家带来的内容是关于css中颜色渐变的实现(三种方式),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. !!注意IE9及之前的版本不支持渐变.Safari要加-webkit- ...

  9. mysql 删除数据表中数据_Mysql-删除数据表-三种方式详解

    Mysql 删除数据表的三种方式详解 用法: 1.当你不再需要该表时, 用 drop; 2.当你仍要保留该表,但要删除所有记录时, 用 truncate; 3.当你要删除部分记录或者有可能会后悔的话, ...

最新文章

  1. Failed to save settings. Please restart Android Studio
  2. linux / 终端常用快捷键
  3. IP地址的简单说明---Linux学习笔记
  4. 硬核,这个充电宝居然烧煤气!
  5. 前端学习(672):if-else
  6. Java中文与ASCII码的转换
  7. lambda函数+map函数的结合使用 list(map(lambda x: list(x)[0], X))
  8. Okhttp3用法案例:查询小车余额
  9. 从0开始学Python,0基础小白
  10. C#中引用第三方ocx控件引发的问题以及解决办法
  11. 图论(二):图的割点(cut vertex)与连通度(connectivity)
  12. 服务器故障内存位置怎么确定,服务器故障内存位置怎么确定
  13. 32位电脑ODBC连接
  14. java 对session的基本使用
  15. 绘制微信字体大小调节器
  16. ado全称_JDBC、ODBC、OLE DB、ADO、ADOMD区别与联系
  17. 私网地址与公网地址转换
  18. 意念控制头环:用脑电波来操控智能家居
  19. 安卓的app在所有应用商店上架方法整理
  20. 基于改进人工蜂群算法的K均值聚类算法(Matlab代码实现)

热门文章

  1. (0,eval)('this')与eval的区别
  2. 十条不错的编程观点(转)
  3. for update 和 for update nowait
  4. 等待3月份的beta1
  5. python 给类添加属性_python – 如何动态添加属性到类中?
  6. activity中获取fragment布局_安卓开发入门教程Fragment
  7. 年底活动那么多!!给你一组超牛的促销标签素材!!!
  8. Qt程序缺少dll解决方案
  9. SU编程和Madagascar编程中的函数对比和区别--终端提示函数
  10. IA-32 System-Level Registers and Data Structures