在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. PHP存储blob示例(转)

    原文:http://www.mysqltutorial.org/php-mysql-blob/ <?php /* CREATE TABLE files ( id INT AUTO_INCREME ...

  2. Php安全规范

    一.基本准则 所有的用户输入都是有害的,对所有从客户端传入的数据都不信任, 需要做判断和过滤(类型,长度,格式,范围),否则可能会受到SQL Injection.XSS等攻击.比如:$_GET, $_ ...

  3. RabbitMQ的work queue(1)

    http://www.rabbitmq.com/tutorials/tutorial-two-java.html 在第一个教程中,我们通过一个命名队列来发送消息和接受消息.在这一节,我们将创建一个工作 ...

  4. seaJS循环依赖的解决原理

    seajs模块的六个状态. var STATUS = {  'FETCHING': 1, // The module file is fetching now. 模块正在下载中  'FETCHED': ...

  5. .net 下载文件几种方式

    方式一:TransmitFile实现下载.将指定的文件直接写入 HTTP 响应输出流,而不在内存中缓冲该文件. protected void Button1_Click(object sender, ...

  6. Office 365 系列五 -------- Imap邮箱迁移步骤

    当客户购买了我们的Office 365之后,第一个功能必然是会用我们的企业邮箱,如果企业之前是用 263.腾讯.网易等的邮件厂商的话,必然会涉及到邮件的迁移, 其实说到邮箱迁移,我们办法很多,如果人数 ...

  7. IDEA工具使用说明

    IDEA使用说明 1.安装 2.开始界面 1)create New Project (新建项目) 2)Import Project  (导入项目) 3)Open (打开已有的项目) 4)Check o ...

  8. nullcon HackIM 2016 -- Crypto Question 1

    You are in this GAME. A critical mission, and you are surrounded by the beauties, ready to shed thei ...

  9. Nodejs中Async模块的流程控制方法

    首先,使用Asycn模块需要安装,它不是node自带的.其次,该模块有大约20多个流程控制方法,我们在这里仅分析常用的series, parallel, waterfall, auto这四种,并且尽量 ...

  10. 不谈业务运维的IT主管早晚被淘汰 这里是10条干货

    大数网 吴玉征 先说个真实的故事. 前一段时间,有一家知名的国际连锁咖啡公司的自助交易系统(支付宝.微信.ApplePAY)特别慢,工作人员也不知道为什么.由于他们刚上了业务运维,支持这套系统的云智慧 ...