`

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

 
阅读更多
  • 转载自:http://blog.chinaunix.net/uid-22548820-id-3181798.html
  • 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中执行. 所以被调用的脚本中声明的变量和环境变量, 都可以在主脚本中得到和使用.

 

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

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
$

分享到:
评论

相关推荐

    在Shell脚本中调用另一个脚本的三种方式讲解

    fork 是最普通的, 就是直接在脚本里面用 path/to/foo.sh 来调用 foo.sh 这个脚本,比如如果是 foo.sh 在当前目录下,就是 ./foo.sh。运行的时候 terminal 会新开一个子 Shell 执行脚本 foo.sh,子 Shell 执行的时候,...

    详解Shell脚本中调用另一个Shell脚本的三种方式

    本文将详细讲解在Shell脚本中调用其他Shell脚本的三种常见方法:`fork`、`exec`以及`source`,并提供实例以帮助理解它们的工作原理和应用场景。 1. **fork** `fork`是最常见的调用方式,它会在当前Shell环境中创建...

    理解面向操作命令的接口SHELL

    当用户输入一个命令时,Bash会通过fork()系统调用创建一个子进程,然后使用exec()系统调用来执行找到的相应命令。这个过程涉及到进程管理和内存映射,是操作系统核心功能的一部分。 **建立Bash脚本** 创建Bash脚本...

    Linux_shell_编程入门(对外版091022)

    8. **进程控制**:学习如何在Shell脚本中启动、停止、监控和管理进程,如fork、exec、wait等。 9. **函数和参数**:了解如何在脚本中定义和调用函数,以及如何传递参数给脚本和函数。 10. **错误处理和调试**:...

    linux_shell编程集合

    8. **正则表达式**:在Shell脚本中,正则表达式用于模式匹配和文本处理。掌握基本的正则表达式语法能帮助我们更有效地处理字符串。 9. **文件与目录操作**:如cd、ls、pwd、mkdir、rmdir、cp、mv、rm等命令用于在...

    Advanced Bash-Scripting Guide <>

    在一个脚本中使用 cmp 来比较2 个文件. 12-33. basename 和 dirname 12-34. 检查文件完整性 12-35. Uudecod 编码后的文件 12-36. 查找滥用的连接来报告垃圾邮件发送者 12-37. 分析一个垃圾邮件域 12-38. 获得一份...

    高级Bash脚本编程指南

    - **source命令**:使脚本在当前Shell环境中执行。 8. **错误处理**:通过set -e使脚本在遇到错误时立即退出,避免进一步的错误。 9. **调试技巧** - **echo和print调试**:输出中间结果,检查变量值。 - **...

    用户接口实验

    - 学会如何编写基本的Shell脚本,包括创建脚本、测试脚本、设置脚本权限等步骤。 - 掌握常用的Shell命令,例如`echo`、`ls`、`function`等,并能灵活运用。 ##### 系统调用 1. **理解操作系统调用的运行机制**:...

    Linux高级bash编程

    高级bash编程 高级Bash脚本编程指南(一) 目录 ++++ 第一部分.... 1.... 2. 带着一个Sha-Bang出发... 在一个脚本中使用 cmp 来比较2个文件. 12-33. basename 和 dirname 12-34. 检查文件完整性 12-35. Uudecod 编码后的...

    操作系统原理课内实验指导书.pdf

    bash 还可以使用进程创建系统调用 fork() 和执行命令的系统调用 exec()。 1.3 编辑和执行 bash 脚本 用户可以使用编辑器来编写 bash 脚本文件,例如文件名为 script。然后,用户可以使用 source 命令来测试脚本,...

    [unix.v6.v7.源码].unix.v6.v7.src.source.code

    在`sys`和`proc`子目录中的源码,展示了如何使用系统调用来控制进程,如`fork()`、`exec()`和`wait()`等。 3. **内存管理**:这些早期版本的UNIX使用了页式虚拟内存管理,源码中的`vm`子目录包含了内存分配和页面...

    emrex-shell:简单的shell模拟器

    `emrex-shell`可能包含对`source`命令的支持,允许执行包含环境变量设置、条件语句和循环结构的shell脚本。 ### 7. 错误处理与提示 为了提供良好的用户体验,`emrex-shell`需要能够处理各种错误情况,如无效的命令...

    测试

    在IT行业中,Shell是一种强大的命令行接口,用于与操作系统交互,尤其在Unix和Linux系统中广泛使用。它不仅是用户输入命令的界面,还允许通过脚本编写自动化任务,提高工作效率。"测试"这个主题可能指的是对Shell...

    UsefulSourceCodes_ForUtilities_source_c_code_utiltities_useful_源

    6. **系统调用**:如`fork()`, `exec()`, `wait()`等,用于创建子进程、执行新程序和等待进程结束,常用于编写shell脚本或者系统级别的工具。 7. **网络编程**:如果源代码涉及到网络工具,可能用到了`socket()`, `...

    我的APUE2读书笔记

    符号链接是一种特殊的文件,它包含另一个文件的路径名而不是文件本身。 **7. 文件重命名** `rename`函数用于更改文件名或移动文件位置。 **8. 文件的时间** 每个文件有三个时间戳:最后访问时间、最后修改时间和...

    linux下c语言开发

    11. **Shell脚本集成**:C程序可以调用`system`函数执行shell命令,或者使用`fork`和`execl`组合实现更复杂的脚本集成。 12. **Makefile**:在大型项目中,使用Makefile来自动化编译过程,通过规则定义如何构建目标...

    linux 基础教程

    学习C语言基础,理解系统调用(如`fork`、`exec`、`read`、`write`)和标准库函数,是进行Linux编程的第一步。 10. **shell脚本**:Bash shell是常用的Linux shell,编写shell脚本可以自动化重复任务。熟悉变量、...

    APUE读书笔记《UNIX环境高级编程第二版》

    - 通过`exec()`执行shell脚本。 **6. setuid(2)和setgid(2)** - `setuid()`和`setgid()`改变进程的有效用户ID和组ID。 **7. system(3)函数** - `system()`执行shell命令。 **8. 用于调度进程的函数** - `sched_...

Global site tag (gtag.js) - Google Analytics