SHELL【1】-在 Shell 脚本中调用另一个 Shell 脚本的三种方式_shell脚本调用另一个shell脚本_大城市的小蜗牛的博客-程序员秘密

技术标签: shell  linux  bash  


前言

提示:以下是介绍为什么写这篇文章:

  1. 如何再shell脚本中调用其他脚本?
  2. 顺序调用会保证脚本的顺序执行吗?

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

先来说一下主要以下有几种方式:

  • fork: 如果脚本有执行权限的话,path/to/foo.sh。如果没有,sh path/to/foo.sh。
  • exec: exec path/to/foo.sh
  • source: source path/to/foo.sh

1.1 fork

fork 是最普通的, 就是直接在脚本里面用 path/to/foo.sh 来调用foo.sh 这个脚本,比如如果是 foo.sh 在当前目录下,就是 ./foo.sh。运行的时候 terminal 会新开一个子 Shell 执行脚本 foo.sh,子 Shell 执行的时候, 父 Shell 还在。子 Shell 执行完毕后返回父 Shell。 子 Shell 从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回父 Shell

1.2 exec

execfork 不同,不需要新开一个子 Shell 来执行被调用的脚本. 被调用的脚本与父脚本在同一个 Shell 内执行。但是使用 exec 调用一个新脚本以后, 父脚本中 exec 行之后的内容就不会再执行了。这是 exec 和 source 的区别.

1.3 source

fork 的区别是不新开一个子 Shell 来执行被调用的脚本,而是在同一个 Shell 中执行. 所以被调用的脚本中声明的变量和环境变量, 都可以在主脚本中进行获取和使用。

其实从命名上可以感知到其中的细微区别,下面通过两个脚本来体会三种调用方式的不同:
第一个脚本,命名为script1.sh:

#!/usr/bin/env bash

A=1

echo "before exec/source/fork: PID for 1.sh = $$"

export A
echo "In 1.sh: variable A=$A"

case $1 in
        --exec)
                echo -e "==> using exec…\n"
                exec ./2.sh ;;
        --source)
                echo -e "==> using source…\n"
                . ./2.sh ;;
        *)
                echo -e "==> using fork by default…\n"
                ./2.sh ;;
esac

echo "after exec/source/fork: PID for 1.sh = $$"
echo -e "In 1.sh: variable A=$A\n"

第二个脚本,我们命名为 2.sh:

#!/usr/bin/env bash

echo "PID for 2.sh = $$"
echo "In 2.sh get variable A=$A from 1.sh"

A=2
export A

echo -e "In 2.sh: variable A=$A\n"

注:这两个脚本中的参数 $$ 用于返回脚本的 PID , 也就是进程 ID。这个例子是想通过显示 PID 判断两个脚本是分开执行还是同一进程里执行,也就是是否有新开子 Shell。当执行完脚本 2.sh 后,脚本 1.sh 后面的内容是否还执行。
$ ./1.sh

PID for 1.sh before exec/source/fork:5845

1.sh: $A is B
using fork by default…
PID for 2.sh: 5242
2.sh get $A=B from 1.sh
2.sh: $A is C
PID for 1.sh after exec/source/fork:5845

1.sh: $A is B

fork方式可以看出,两个脚本都执行了,运行顺序为1-2-1,从两者的PID值,可以看出,两个脚本是分成两个进程运行的。

$ ./1.sh – exec

PID for 1.sh before exec/source/fork:5562
1.sh: $A is B
using exec…
PID for 2.sh: 5562
2.sh get $A=B from 1.sh
2.sh: $A is C

exec方式运行的结果是,2执行完成后,不再回到1。运行顺序为1-2。从pid值看,两者是在同一进程中运行的。
$ ./1.sh source

PID for 1.sh before exec/source/fork:5156
1.sh: $A is B
using source…
PID for 2.sh: 5156
2.sh get $A=B from 1.sh
2.sh: $A is C
PID for 1.sh after exec/source/fork:5156
1.sh: $A is C

source方式的结果是两者在同一进程里运行。该方式相当于把两个脚本先合并再运行。

二. 等待.sh脚本仅在另一个脚本完成后才能运行?

2.1 &&连接器

只需使用&&连接器(即复合命令):

./script1.sh && ./script2.sh

但是请注意,只有script1.sh 即第一个脚本退出代码为0(即没有错误)时,才会执行第二个脚本。

2.2 ;连接器

如果要执行序列,无论第一个脚本的结果如何,只需执行以下操作

./script1.sh ; ./script2.sh

您可以测试两个连接器的行为:

$ true && echo aa
aa
$ false && echo aa
$ false ; echo aa
aa

总结

除了exec 之外,其他都可以顺序执行,只是如果对环境变量有要求的话,就要分辨使用fork还是source

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_46535940/article/details/124959568

智能推荐

RECON使用札记_邵钏的博客-程序员秘密

 RECON是一款寻找重复序列的软件,因工作之故,接触了两天,挫折不少,札记于下:安装如readme文档中所言即可。注意:recon.pl脚本中的path参数最好为绝对路径(至少在我的机器上使用相对路径有时候会出错)。如果是Windows机器上安装了Cygwin,并且使用了Cygwin中的perl编译器,那么由于两大操作系统中命令的冲突(反映在recon中,为sort命令的冲突),会导致“命令指定

大数据实习生的面试总结_weixin_30326741的博客-程序员秘密

不同的公司面试内容不同,有的注重基础知识有的注重项目,对实习生,也就是应届生,更多的是基础因为没有什么工作经验,项目很多也不怎么样,所以也就问的少。下面是我的一点面试经验我面试次数不多,可能是运气比较好,几家就有了一个很满意的。一共面过两次大数据职位一次java,一次商务智能,数据分析的。 第一次就是大数据的,数据平台开发,小公司,没有笔试,就是拿着简历上的...

AI challenger 场景分类 PyTorch 迁移学习 resnet18_Wayne2019的博客-程序员秘密

没计算资源,只能简单测试下resnet18训练代码(带验证):'''TODO:- 采用更深的网络(简单,但是需要计算资源)- top3 accuracy,可参考https://github.com/pytorch/examples/blob/master/imagenet/main.py'''#pkill -9 python#nvidia-smiimport osimport tor

百度搜索使用技巧_终身编程者的博客-程序员秘密

百度搜索使用技巧,使用SEO指令进行检索,快速得到想要的结果,使用 intitle 搜索网站标题,intext 搜索网站正文内容,inurl 搜索指定类型网站或网址,限定时间范围检索,排除或包含关键字等等......

设计模式(三)-- 代理模式_messi 三个设计策略_leo_messi94的博客-程序员秘密

1.基本介绍代理模式:为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象。这样做的好处是:可以在目标对象实现的基础上,增强额外的功能能操作,即扩展目标对象的功能。被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象代理模式有不同的形式,主要有三种静态代理动态代理(JDK代理)Cglib代理(可以在内存动态的创建对象,而不需要实现接口)2.静态代理2.1 基本介绍:静态代理在使用时,需要定义接口或者父类,被代理对象(即目标对象)与代理对象一起实现

随便推点

Debian GNU/Linux 中以源码方式安装Odoo 14(社区版)_odoo源码实施部署到linux_乐渔leyu的博客-程序员秘密

     Odoo是一种流行的开源商务应用程序套件,可帮助公司管理和运营其业务,也可用于在线教学。它包括广泛的应用程序。Debian GNU/Linux 是社区版服务器的代表。本文将介绍如何在Debian GNU/Linux中以源码方式安装和部署Odoo 14(已在Debian 10及Debian 11中测试通过)。1.安装依赖# apt install git python3-pip build-essential wget python3-dev p

SQLCipher的使用_sqlcipher下载了怎么使用_yunshouhu的博客-程序员秘密

http://blog.csdn.net/majiakun1/article/details/46551137SQLCipher 是用来加密数据库一. 1.安装sqlcipher命令,首先需要安装brew,   在终端输入  ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/inst

基于mysql存储过程实现自增批量插入数据_mysql 存储过程自增变量_dongyong2020的博客-程序员秘密

基于mysql存储过程实现自增批量插入数据1、创建数据库表-- 创建数据库CREATE DATABASE IF NOT EXISTS db_mysql DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;-- 创建用户CREATE USER 'test'@'%' IDENTIFIED BY '123456';-- 授权GRANT ALL ON db_mysql.* TO 'test'@'%';-- 创建测试表CREATE TABLE

CentOs7 修复 引导启动_乐渔leyu的博客-程序员秘密

一、修复MBR:MBR(Master Boot Record主引导记录): 硬盘的0柱面、0磁头、1扇区称为主引导扇区。其中446Byte是bootloader,64Byte为Partition table,剩下的2Byte为magic number。备份MBR: #dd if=/dev/sda of=/root/mbr.bak count=1 bs=512破坏...

python-使用tkinter写一个简单的GUI界面_宋yongchao的博客-程序员秘密

python gui 中三大框架tkinter,wxpython, pyqtTkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口 .Tk 和 Tkinter 可以在大多数的 Unix 平台下使用,同样可以应用在 Windows 和 Macintosh 系统里。Tkinter的缺点,如果你想要构建一个GUI界面布局,你就必须自己写代码,因为Tkinter没有提供一个图形界面设计器,我估计这也是很多人没有选择它来做软件的一个最主要原因。(QT给我们带来最方便的好处,就是它有

SpringBoot +DynamicDataSource切换多数据源记录方法_王者之座的博客-程序员秘密

刚开始用一个数据源,但是上头要求要做多数据源切换的。看了框架有自带的可以切数据源但是数据源是固定在YML文件的;一、固定多个数据源切换1.由于我这个版本的自带DynamicDataSource包 我就不引入了。各位看官缺包自行去maven上查Dynamic-DataSource第一个就是了。2.在yml中配置两个数据源3.启动时启动连接池的方法获取,在APPLICATION启动...

推荐文章

热门文章

相关标签