在bash shell中,source、exec以及sh都可以用来执行shell script,但是它们的差别在哪里呢?

sh:父进程会fork一个子进程,shell script在子进程中执行

source:在原进程中执行,不会fork子进程

exec:在原进程中执行,但是同时会终止原进程

注:使用export会把父进程中的变量向子进程中继承,但是反过来却不行,在子进程中,不管环境如果改变,均不会影响父进程

 

下面用一个例子来讲解

  1. 1.sh
  2. #!/bin/bash
  3. A=B
  4. echo "PID for 1.sh before exec/source/fork:$"
  5. export A
  6. echo "1.sh: \$A is $A"
  7. case $1 in
  8. exec)
  9. echo "using exec..."
  10. exec ./2.sh ;;
  11. source)
  12. echo "using source..."
  13. . ./2.sh ;;
  14. *)
  15. echo "using fork by default..."
  16. ./2.sh ;;
  17. esac
  18. echo "PID for 1.sh after exec/source/fork:$"
  19. echo "1.sh: \$A is $A"
  1. 2.sh
  2. CODE:
  3. #!/bin/bash
  4. echo "PID for 2.sh: $"
  5. echo "2.sh get \$A=$A from 1.sh"
  6. A=C
  7. export A
  8. echo "2.sh: \$A is $A"

下面在命令行中去执行

./1.sh fork

可以看到,1.sh是在父进程中执行,2.sh是在子进程中执行的,父进程的PID是5344,而子进程的是5345,当子进程执行完毕后,控制权返回到父进程。同时,在子进程改变环境变量A的值不会影响到父进程。

./1.sh source

由结果可知,1.sh和2.sh都是在同一进程中执行的,PID为5367

./1.sh exec

可知,两个脚本都是在同一进程中执行,但是请注意,使用exec终止了原来的父进程,因此,可以看到

  1. echo "PID for 1.sh after exec/source/fork:$"
  2. echo "1.sh: \$A is $A"

这两个命令没有执行

由这个例子,便大致可了解它们的区别了

exec、source以及bash的区别(zz)的更多相关文章

  1. shell 中exec、source以及bash的区别

    在bash shell中,source.exec以及sh都可以用来执行shell script,但是它们的差别在哪里呢? sh:父进程会fork一个子进程,shell script在子进程中执行 so ...

  2. souce and bash 的区别

    对于一些环境变量的配置文件,如想使更改后立即生效,多用 souce +file 执行后即可.如/etc/profile 里加了配置, source 和  bash 的区别: source filena ...

  3. fork exec source的区别

    参考:http://www.cnblogs.com/bkygg/p/5023072.html 1:fork  运行的时候开一个sub_shell 执行调用的脚本,sub_shell执行的时候,pare ...

  4. shell中sh, exec, source, fork, ./的区别

    shell中sh, exec, source, fork, ./的区别 1,sh sh test.sh ​ sh是通过创建子进程(subshell)去执行脚本,父进程无法使用子进程中的变量,而子进程对 ...

  5. shell脚本中调用另一个脚本的三种不同方法(fork, exec, source)

    fork ( /directory/script.sh) fork是最普通的, 就是直接在脚本里面用/directory/script.sh来调用script.sh这个脚本. 运行的时候开一个sub- ...

  6. 在shell脚本中调用另一个脚本的三种不同方法(fork, exec, source)——转载

    原文链接:http://blog.chinaunix.net/uid-22548820-id-3181798.html fork ( /directory/script.sh) :如果shell中包含 ...

  7. shell调用另一个脚本的三种方式fork/exec/source

    exec和source都属于bash内部命令(builtins commands),在bash下输入man exec或man source可以查看所有的内部命令信息. bash shell的命令分为两 ...

  8. shell脚本头,#!/bin/sh与#!/bin/bash的区别.

    因为今天写了个小脚本,死活不成功,总是报文件或者目录不存在,问了一下我们马同学的正常写法,发现只有脚本头的区别,也就是今天本文要讲的#!/bin/sh与#!/bin/bash. 本文参考:https: ...

  9. 一次flume exec source采集日志到kafka因为单条日志数据非常大同步失败的踩坑带来的思考

    本次遇到的问题描述,日志采集同步时,当单条日志(日志文件中一行日志)超过2M大小,数据无法采集同步到kafka,分析后,共踩到如下几个坑.1.flume采集时,通过shell+EXEC(tail -F ...

随机推荐

  1. 分析一个类似于jquery的小框架 (2)

    核心构造函数 (function ( window, undefined ) { // 定义Itcast构造函数 function Itcast ( selector ) { return new I ...

  2. Delphi控制Excel输出上标示例

    直接上代码吧,这个示例在Excel中输出一个M2: unit FfrmMain; interface uses Winapi.Windows, Winapi.Messages, System.SysU ...

  3. Sort命令使用

    查看haproxy日志的某一时间段的关于某个url的访问IP降序排序:           注意:排序(sort)在去重(uniq)之后使用 p 指的是从包含某一个字符到某一字符的区间的所有行打印输出 ...

  4. HTML5标签的3大类型

    1>块级标签: 独占一行的标签,能随时设置宽度和高度 比如:div.p.h1.h2.u1.li 2>行内标签(内联标签): 多个行内标签能同时显示在一行,宽度和高度取决于内容的尺寸 比如: ...

  5. ubuntu用apt安装apache2时,出现E:未发现软件包 apache2

    解决方法:使用sudo apt-get update更新软件包 更新软件包失败,多半使用因为源文件不干净,在/etc/apt下重新自己新写一份源文件 然后执行 sudo apt-get update

  6. DIOCP之开发流程图之Client

    本次分析开发流程图采用的是DIOCP群里的群友[彩蛋]所给的DEMO,依然是win7的画图作品. 本人分析认为:学习网络开发不同本地开发,首先你应该知道完整的开发流程即网络程序运行的先后顺序,有个整体 ...

  7. asp.net GDI+ 绘制椭圆 ,弧线,扇形

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  8. Android菜鸟成长记12 -- ORMLite的简单使用

    在我们的开发中,为了提高开发效率,我们一般都会使用到框架,ormilte则是我们必不可少的数据库框架. 对于ORMLite我也是今天才刚刚接触,我们先从一个简单的项目来了解它吧. ORMLite ja ...

  9. oracle 调用java

    1.首先在PL/SQL中创建JAVA类,并编译 例如:这个是到的一个查询目录下面文件列表的java类 创建此java 类用: create or replace and compile java so ...

  10. map集合键值对存储,键值不重复,值可以重复

    import java.util.HashMap; import java.util.Hashtable; import java.util.Iterator; import java.util.Li ...