`

shell 子脚本执行的三种方式

 
阅读更多

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

  • 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

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

2.sh

复制代码
1 #!/bin/bash
2 echo "PID for 2.sh: $$"
3 echo "2.sh get \$A=$A from 1.sh"
4 A=C
5 export A
6 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脚本中获取进程ID的方法

    当我在执行shell脚本时,它会启动一个叫子shell的进程。作为主shell的子进程,子shell将shell脚本中的命令作为批处理运行(因此称为“批处理进程”)。 在某些情况下,你也许想要知道运行中的子shell的PID。这个PID...

    LinuxShell脚本学习基础视频

    【】11a00d99b60c4e2eba3440b8aa3a6bdd【】linux_shell脚本编程_01认识shell,如何编写shell脚本和执行【】linux_shell脚本编程_02vivim简单的常用操作【】linux_shell脚本编程_03变量和数值运算,父shell和子shell的...

    非常简单的Shell菜单脚本

    本文介绍的“非常简单的Shell菜单脚本”就是一种基础的Shell脚本应用,它创建了一个简单的菜单系统,使用户能够通过选择编号来执行不同的功能,实现了人机交互的“傻瓜式”操作。 首先,脚本通过`#!/bin/sh`行指定...

    C语言中文网shell脚本教程

    `3.6Shell Here Document(内嵌文档_立即文档).html`将解释Here Document的概念,这是一种方便的输入重定向方式,允许在脚本中直接插入多行文本,常用于创建配置文件或模拟用户输入。 5. **Shell关联数组** `...

    shell脚本大全

    10. **脚本调试**:`set -x`开启命令追踪,显示脚本执行的每个步骤;`set -v`开启命令回显,显示脚本中的每一行。 通过阅读和实践"shell脚本大全"中的例子,你可以逐步掌握这些概念,并学会如何编写自己的脚本来...

    【shell脚本】shell脚本之概念、运行方式、变量的使用、交互式脚本、运算(shell脚本基础学习一)

    运行shell脚本有三种主要方式: 1. 添加执行权限:使用`chmod +x test1.sh`命令赋予脚本执行权限。 2. 使用解释器执行:通过`bash test1.sh`启动一个新的子进程来运行脚本。 3. 使用当前解释器执行:使用`source ...

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

    先来说一下主要以下有几种方式: fork: 如果脚本有执行权限的话,path/to/foo.sh。如果没有,sh path/to/...运行的时候 terminal 会新开一个子 Shell 执行脚本 foo.sh,子 Shell 执行的时候, 父 Shell 还在。子 Shell

    Shell脚本编程详解

    Shell提供了一些内部参数,这些参数提供了关于脚本执行环境的信息。常用的内部参数包括 `$0` (脚本名称)、`$#` (位置参数的数量)、`$*` (所有位置参数) 和 `$?` (最后一个命令的退出状态)。 **2.2 表达式比较、...

    详解shell中source、sh、bash、./执行脚本的区别

    这种方式不需要文件有执行权限,因为它是作为shell的一部分运行的,而不是一个新的子进程。通常,当你需要立即更新环境变量(如通过修改`.bashrc`或`.bash_profile`)时,你会使用`source`。 2. **sh和bash命令**:...

    shell变量与创建子shell详解

    在Shell脚本中,创建子Shell是一种常见的操作,它可以提供一个隔离的执行环境,使得在其中执行的命令和脚本不会影响到父Shell的状态。本文将详细解释Shell变量和创建子Shell的过程,并通过实例加深理解。 首先,...

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

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

    脚本shell写的,一些工作脚本集合

    虽然没有列出具体的子文件名,但我们可以推测这个“bin”目录可能包含可执行的Shell脚本文件。在Linux或Unix系统中,"bin"目录通常用于存放可执行程序。因此,这些脚本可能已经过优化,可以直接运行,为用户提供即时...

    shell脚本4种执行方式

    了解这四种执行方式对于理解和优化shell脚本的运行至关重要。根据实际需求选择合适的执行方式,能够提高工作效率,减少不必要的麻烦。在编写和执行shell脚本时,务必注意权限设置、脚本内容的正确性和解释器的选择,...

    编写shell脚本经典教材

    2. 子shell:在脚本内部启动新的Shell实例,运行独立的任务。 3. 别名与函数:创建命令别名或函数,简化命令输入。 九、案例分析 "如何编写一个shell脚本.doc"文档可能包含具体的步骤和示例,教授如何从无到有地...

    shell脚本的常用格式及写法

    Shell脚本,全称为Bash Shell脚本,是Linux或Unix系统中的一种程序设计语言,它基于Shell命令行解释器,允许用户通过编写脚本来自动化一系列的系统操作。Shell脚本的编写对于日常的系统管理和自动化任务至关重要。...

    我的几个常用shell脚本

    在IT领域,Shell脚本是一种极其实用的工具,特别是在Linux和Unix系统中。Shell脚本是用Shell语言编写的程序,允许用户通过命令行界面自动化执行一系列操作。在这个名为"我的几个常用shell脚本"的压缩包中,包含了...

    python编写shell脚本

    #### 三、Python 编写 Shell 脚本的基本方法 在使用 Python 编写 Shell 脚本时,我们需要掌握几个基本的技巧和概念: 1. **使用 os 模块**:Python 的 `os` 模块提供了一系列用于与操作系统交互的函数。例如,`os....

    shell脚本学习指南pdf

    - **调试技巧**: 如设置set命令来追踪脚本执行过程,找出问题所在。 8. **脚本实践** - **实用脚本示例**: 书中会提供各种实际场景下的脚本案例,如系统维护、日志分析、文件备份等。 - **脚本设计原则**: 学习...

    Shell脚本编程.pdf

    Shell脚本是一种文本文件,其中包含了Linux命令和控制结构,用于自动化一系列的系统操作。在本篇PDF中,作者详细介绍了如何编写、修改权限以及执行Shell程序,同时还讲解了在脚本中使用参数、变量和控制结构。 1. *...

    Linux_Shell脚本攻略.第3版

    Shell脚本是Linux系统中的强大工具,它允许用户通过编程的方式来自动化执行一系列命令,极大地提高了工作效率。这本书以其高清无水印的版面和精心编排的内容,被誉为学习Shell脚本的最佳资源。 本书覆盖了Shell脚本...

Global site tag (gtag.js) - Google Analytics