文档章节

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

独钓渔
 独钓渔
发布于 2015/06/01 17:23
字数 820
阅读 1873
收藏 16

一、fork  ( /directory/script.sh) :如果shell中包含执行命令,那么子命令并不影响父级的命令,在子命令执行完后再执行父级命令。子级的环境变量不会影响到父级。
fork是最普通的, 就是直接在脚本里面用/directory/script.sh来调用script.sh这个脚本.
运行的时候开一个sub-shell执行调用的脚本,sub-shell执行的时候, parent-shell还在。
sub-shell执行完毕后返回parent-shell. sub-shell从parent-shell继承环境变量.但是sub-shell中的环境变量不会带回parent-shell

二、exec (exec /directory/script.sh):执行子级的命令后,不再执行父级命令。
exec与fork不同,不需要新开一个sub-shell来执行被调用的脚本.  被调用的脚本与父脚本在同一个shell内执行。但是使用exec调用一个新脚本以后, 父脚本中exec行之后的内容就不会再执行了。这是exec和source的区别

三、source (source /directory/script.sh):执行子级命令后继续执行父级命令,同时子级设置的环境变量会影响到父级的环境变量。
与fork的区别是不新开一个sub-shell来执行被调用的脚本,而是在同一个shell中执行. 所以被调用的脚本中声明的变量和环境变量, 都可以在主脚本中得到和使用.

可以通过下面这两个脚本来体会三种调用方式的不同:
cat 1.sh:

#!/bin/bash
A=B 
echo "PID for 1.sh before exec/source/fork:$$"
export A
echo "1.sh: \$A is $A"
case $1 in
        exec)
                echo "using exec…"
                exec ./2.sh ;;
        source)
                echo "using source…"
                . ./2.sh ;;
        *)
                echo "using fork by default…"
                ./2.sh ;;
esac
echo "PID for 1.sh after exec/source/fork:$$"
echo "1.sh: \$A is $A"

cat 2.sh:

#!/bin/bash
echo "PID for 2.sh: $$"
echo "2.sh get \$A=$A from 1.sh"
A=C
export A
echo "2.sh: \$A is $A"

结果:

[root@localhost ~]# ./1.sh 
PID for 1.sh befor exec/source/fork:1076
1.sh:$A is B
using fork by default...
PID for 2.sh: 1077
2.sh get $A=B from 1.sh
2.sh: $A is C
PID for 1.sh after exec/source/fork:1076
1.sh:$A is B
[root@localhost ~]# ./1.sh exec
PID for 1.sh befor exec/source/fork:1078
1.sh:$A is B
using exec...
PID for 2.sh: 1078
2.sh get $A=B from 1.sh
2.sh: $A is C
[root@localhost ~]# ./1.sh source
PID for 1.sh befor exec/source/fork:1079
1.sh:$A is B
using source...
PID for 2.sh: 1079
2.sh get $A=B from 1.sh
2.sh: $A is C
PID for 1.sh after exec/source/fork:1079
1.sh:$A is C
[root@localhost ~]#

由此可见:

fork()   1.sh和2.sh各是一个不同的进程,子进程继承父进程的环境变量,创进新的进程,子进程结束后反回父进程。这是个是shell中最常用的。

exec()  1.sh和2.sh都打印了同一个进程号,是同一进程,子进程创进是替代父进程,子进程结束时,退了进程,没有打印原属于1.sh的after部分。验证可以在shell中执行 exec ls这样会退出登陆。   
source()  1.sh和2.sh是同一进程,子程序的命令完成后续继执行父程序的命令,当然,子程序改变了环境变量会影响父程序的因为同一进程。

本文转载自:http://www.cnblogs.com/bugY/archive/2012/03/30/2425572.html

独钓渔
粉丝 48
博文 408
码字总数 157886
作品 0
沙坪坝
系统管理员
私信 提问
加载中

评论(1)

独钓渔
独钓渔 博主
自己都遇上一一个tomcat的坑,
tomcat的启动脚本是bin/startup.sh 这里有除了环境变量设置,启动时用的是exec
如果采用远程开启的话,远程的shell退出时会给他启动的子进程发送一个广播的signal 信号,这时会导致tomcat退出。
修改startup.sh里的启动语句,在exec后再加上一个nohup 这样tomcat 会忽略虚拟终端的shell退出时的广播的信号。
linux shell 编程 9 脚本中调用脚本

在shell脚本中调用另一个脚本的三种不同方法(fork, exec, source) 1、fork 调用脚本 fork ( /directory/script.sh) fork是最普通的, 就是直接在脚本里面用/directory/script.sh来调用script....

QH_C
2015/11/11
14
0
在shell脚本中调用另一个脚本的三种不同方法(fork, exec, source)

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

神勇小白鼠
2011/08/03
721
0
SHELL执行的三种模式

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

独钓渔
2016/03/28
178
0
linux系统shell中调用另一个脚本的三种不同方法(source,exec,fork)

1. fork ( /directory/script.sh) :如果shell中包含执行命令,那么子命令并不影响父级的命令,在子命令执行完后再执行父级命令。子级的环境变量不会影响到父级。 fork是最普通的, 就是直接在...

captaing
2017/07/04
0
0
linux shell脚本调用另一个脚本

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

张欢19933
2016/03/25
110
0

没有更多内容

加载失败,请刷新页面

加载更多

parseint和isNaN用法

本文转载于:专业的前端网站➭parseint和isNaN用法 <!doctype html><html><head><meta charset="utf-8"><title>无标题文档</title></head><body><script> var a='12'; alert......

前端老手
今天
7
0
Kylin 精确去重在用户行为分析中的妙用

作者:史少锋,Apache Kylin committer & PMC,2019/10/11 在上次文章《如何在 1 秒内做到大数据精准去重》中,我们介绍了 Apache Kylin 为什么要支持大数据集上的精确去重,以及基于 Bitmap...

ApacheKylin
今天
5
0
学习记录(二) es6基本语法(rest参数,模板化,axios模块,拦截器)

日常学习记录 模块化:把一个大文件分成多个小文件,按照一定规范进行拼接 es5写法: 导出:module.exports = 数据 导入:require("路径") /路径未添加后缀名时 //默认添加.js //把路径作为文件名...

Pole丶逐
今天
4
0
以程序员的角度怎么购买一台「性价比高的电视」

前俩天有小伙伴在我的文章下留言,说能否把 【国内电视机都介绍一下】,今天我已在TV端开发多年的程序员的角度。谈谈已程序员的角度如何购买一台性价比高的电视。 国内大的电视机品牌介绍 长...

我们都很努力着
今天
5
0
PhotoShop 色调:理解直方图/RGB通道信息

一、直方图:图表的形式,展示图像像素分布的情况 1.平均值:表示平均亮度 2.标准偏差值:表示亮度值范围内的中间值 3.像素: 表示用于计算直方图的像素总数 4.色阶:显示指针下面的区域亮度...

东方墨天
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部