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

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

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

exec: exec path/to/foo.sh

source:source path/to/foo.sh

fork

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

exec

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

source

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

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

第一个脚本,我们命名为 1.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后面的内容是否还执行。

chmod +x 1.sh 2.sh给两个脚本加上可执行权限后执行情况:

fork

a2531eead10e5adaa7b412068d47b0dd.png

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

exec

5125ca7ee6f1c2c1ca33c03c8d08124e.png

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

source

84fd47034ae02d36bc1635c434607384.png

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

156272b5972594a7c578299afad04840.png

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

您可能感兴趣的文章:Shell中exit和return的区别讲解

使用shell脚本来给mysql加索引的方法

干掉一堆mysql数据库,仅需这样一个shell脚本(推荐)

linux shell之通过标识测试文件系统属性的方法示例

linux shell中if的各种判断

linux shell之pushd、popd和dirs的使用讲解

linux shell之控制台打印各种颜色字体和背景的实现方法

shell脚本实现监控某个进程意外停止后拉起进程

使用shell脚本每天对MySQL多个数据库自动备份的讲解

使用shell来发tcp包的方法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值