当前位置: 首页 > news >正文

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

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

fork  ( /directory/script.sh)
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中执行. 所以被调用的脚本中声明的变量和环境变量, 都可以在主脚本中得到和使用.



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

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"

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"

 

 

执行情况:

$ ./1.sh     
PID for 1.sh before exec/source/fork:5845364
1.sh: $A is B
using fork by default…
PID for 2.sh: 5242940
2.sh get $A=B from 1.sh
2.sh: $A is C
PID for 1.sh after exec/source/fork:5845364
1.sh: $A is B
$ ./1.sh exec
PID for 1.sh before exec/source/fork:5562668
1.sh: $A is B
using exec…
PID for 2.sh: 5562668
2.sh get $A=B from 1.sh
2.sh: $A is C
$ ./1.sh source 
PID for 1.sh before exec/source/fork:5156894
1.sh: $A is B
using source…
PID for 2.sh: 5156894
2.sh get $A=B from 1.sh
2.sh: $A is C
PID for 1.sh after exec/source/fork:5156894
1.sh: $A is C
$

转载于:https://my.oschina.net/shootercn/blog/29186

相关文章:

  • ActionScript3游戏中的图像编程(连载十七)
  • Telnet Windows Server时,提示NTLM authenticatio错误解决方法
  • 深入分析关于DHCP SNOOPING的设置
  • 关于 ACCESS 中插入操作的相关内容
  • 深挖BAT内部级别和薪资待遇,你敢看?(转)
  • 学习 WCF (4)--学会使用配置文件
  • 《3D Math Primer for Graphics and Game Development》读书笔记2
  • LAMP之php 与 mysql 配置(三)
  • 走进wordpress 详细说说template-loader.php
  • ubuntu的备份和还原
  • 【转】Android 带checkbox的listView 实现多选,全选,反选----解决checkbox错位问题
  • ACL访问控制列表及特殊权限
  • [裴礼文数学分析中的典型问题与方法习题参考解答]4.5.5
  • Ubuntu APT使用指南
  • 6个常见的 PHP 安全性攻击
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • create-react-app做的留言板
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • PhantomJS 安装
  • Python_网络编程
  • Python爬虫--- 1.3 BS4库的解析器
  • ReactNativeweexDeviceOne对比
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • swift基础之_对象 实例方法 对象方法。
  • webpack4 一点通
  • WePY 在小程序性能调优上做出的探究
  • 彻底搞懂浏览器Event-loop
  • 大主子表关联的性能优化方法
  • 前端性能优化--懒加载和预加载
  • 微信小程序填坑清单
  • Mac 上flink的安装与启动
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (笔试题)分解质因式
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (强烈推荐)移动端音视频从零到上手(上)
  • (十六)Flask之蓝图
  • *p++,*(p++),*++p,(*p)++区别?
  • .Net 8.0 新的变化
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • .py文件应该怎样打开?
  • /etc/sudoers (root权限管理)
  • ?
  • @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
  • @TableId注解详细介绍 mybaits 实体类主键注解
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • [ 网络基础篇 ] MAP 迈普交换机常用命令详解
  • [.net] 如何在mail的加入正文显示图片
  • [1204 寻找子串位置] 解题报告