`

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脚本中调用另一个脚本的三种方式讲解

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

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

    新开一个子 Shell 执行,子 Shell 可以从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回给父 Shell。 exec 在同一个 Shell 内执行,但是父脚本中 exec 行之后的内容就不会再执行了 source 在同一...

    shell脚本判断文件夹或目录是否存在,不存在则创建新文件夹或目录.sh

    shell自动化脚本,自动判断文件夹(目录)是否存在,如不存在自动创建,可执行,下载可测试

    shell脚本实现多进程运行的方法示例

    本文主要跟大家分享了shell脚本实现多进程运行的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 例子 for ip in 192.168.56.{1..254} do ( ping $ip -c 4 &>/dev/null; if [ $? -eq 0 ]; then echo...

    学习笔记《LINUX+SHELL脚本攻略》Sarath Lakshman

    数也能像环境变量一样用export到处,如此,函数的作用域就可以扩展到子进程中。 export -f fname Linux export命令用于设置或显示环境变量。 在shell中执行程序时,shell会提供一组环境变量。export可新增,修改...

    Linux Shell 编程实战.zip

    Shell是Linux的外壳,是Linux的用户界面, Shell为用户提供了输入命令和参数并可得到命令执行结果的环境。用户对Shell理解越深刻, Shell对用户工作的支持就越有力。可以说,熟练掌握Shell编程,能大大提高系统...

    unix 下脚本语言shell入门编程

    要达到这样的目的,通常我们利用shell程序或者shell脚本来实现。  一、简介  Shell编程有很多类似C语言和其他程序语言的特征,但是又没有编程语言那样复杂。Shell程序就是放在一个文件中的一系列Linux命令和实用...

    基于shell脚本中cd命令无效的解决方法

    解释:执行的时候是./c.sh来执行的,这样执行的话终端会产生一个子shell(类似于C语言调用函数),子shell去执行我的脚本,在子shell中已经切换了目录了,但是子shell一旦执行完,马上退出,子shell中的变量和操作...

    Shell脚本获取进程的运行时间

    所以我就在想,我今后启动这个脚本时,进行检查,如果上次运行的脚本还没结束,而且过了某个时间阀值,就把它及其子进程给kill掉。然后,我就需要写了一个可以查询某个进程已经运行了多少时间(以second为单位)的...

    Linux Shell编程

    Shell 脚本语言是 Linux/Unix 系统上一种重要的脚本语言,在 Linux/Unix 领域应用 极为广泛,熟练掌握 Shell 脚本编程是一个优秀的 Linux/Unix 开发者和...子,结合例子介绍 Shell 脚本的基本元素及其执行脚本的方法。

    shell 编程指南pdf

    2.1.13 使用exec或ok来执行shell命令 19 2.1.14 find命令的例子 20 2.2 xargs 20 2.3 小结 21 第3章 后台执行命令 22 3.1 cron和crontab 22 3.1.1 crontab的域 22 3.1.2 crontab条目举例 23 3.1.3 crontab命令选项 ...

    在java的JSch程序中运行linux主机上的shell脚本.docx

    远程shell脚本 下面的代码放入一个文件:hello.sh,脚本的内容很简单只是用来测试,回显输出“hello <参数1> ” #! /bin/sh echo "hello $1\n"; 然后我把它放到远程主机的/root目录下面,远程主机的IP是1.1.1.1...

    Arduino-Arduino-Shell.zip

    Arduino-Arduino-Shell.zip,用于arduinorduino shell的rpn postscript/forth命令shell,Arduino是一家开源软硬件公司和制造商社区。Arduino始于21世纪初,深受电子制造商的欢迎,Arduino通过开源系统提供了很多灵活性...

    尚官Linux Shell 编程实战

    Shell是Linux的外壳,是Linux的用户界面, Shell为用户提供了输入命令和参数并可得到命令执行结果的环境。用户对Shell理解越深刻, Shell对用户工作的支持就越有力。可以说,熟练掌握Shell编程,能大大提高系统...

    shell-编写监控平台

    1、 肯定要有一个监控脚本(子程序),用来监控收集各硬件信息 2、 需要邮件告警的话肯定需要一个发邮件脚本,一般是和一个PHP专门发邮件的脚本做联动 3、 输出日志的脚本(作为对监控平台错误日志的收集,更准确的...

    LINUX与UNIX SHELL编程指南(很全)

    2.1.13 使用exec或ok来执行shell命令 19 2.1.14 find命令的例子 20 2.2 xargs 20 2.3 小结 21 第3章 后台执行命令 22 3.1 cron和crontab 22 3.1.1 crontab的域 22 3.1.2 crontab条目举例 23 3.1.3 crontab命令选项 ...

    LINUX与UNIX SHELL编程指南

    ##强烈推荐 ##本电子书籍“LINUX与UNIX SHELL编程指南”中文版,共分29章,每一章独立一个PDF文档,可系统的学习Unix/Linux shell编程知识,同时可作为手册工具使用。...第二八章 运行级别脚本 第二九章 CGI脚本

    脚本:轻松在Go中编写类似shell的脚本

    script是一个Go库,用于执行shell脚本擅长的那种任务:读取文件,执行子进程,计算行数,匹配字符串等。 为什么用Go编写系统管理程序不像在典型的Shell中那样容易? script旨在使其变得如此简单。 Shell脚本通常...

Global site tag (gtag.js) - Google Analytics