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

 更新时间:2019年04月04日 14:36:00   作者:admin  
今天小编就为大家分享一篇关于在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

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

exec

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

source

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

总结

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

相关文章

  • CCKiller:Linux轻量级CC攻击防御工具,秒级检查、自动拉黑和释放

    CCKiller:Linux轻量级CC攻击防御工具,秒级检查、自动拉黑和释放

    这篇文章主要介绍了CCKiller:Linux轻量级CC攻击防御工具,秒级检查、自动拉黑和释放,需要的朋友可以参考下
    2016-02-02
  • shell自定义函数及参数调用解析

    shell自定义函数及参数调用解析

    与其它的脚本语言一样,bash同样支持函数。本文为大家介绍在bash中定义与使用函数的方法,有需要的朋友可以参考下
    2013-02-02
  • bash shell 自定义函数命令持久化生效问题

    bash shell 自定义函数命令持久化生效问题

    这篇文章主要介绍了bash shell 自定义函数命令持久化生效,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • Shell脚本中实现把输入的密码转换为*(星号)的方法

    Shell脚本中实现把输入的密码转换为*(星号)的方法

    这篇文章主要介绍了Shell脚本中实现把输入的密码转换为*(星号)的方法,从而把密码字符串隐藏起来,比较实用的一个功能,在做交互设计时非常有用哦,需要的朋友可以参考下
    2014-06-06
  • Django中shell命令的使用

    Django中shell命令的使用

    Django的manage工具提供了shell命令,本文主要介绍了Django中shell命令的使用,方便直接在终端中执行测试python语句,有需要的小伙伴可以参考下
    2021-05-05
  • Shell定时删除指定时间之前的文件

    Shell定时删除指定时间之前的文件

    这篇文章主要介绍了Shell定时删除指定时间之前的文件,本文用来删除一个月之前的备份文件,并加入到crontag定时删除,需要的朋友可以参考下
    2014-12-12
  • Linux grep -q用法示例详解

    Linux grep -q用法示例详解

    grep指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设grep指令会把含有范本样式的那一列显示出来,这篇文章主要介绍了Linux grep -q用法示例详解,需要的朋友可以参考下
    2023-02-02
  • Linux查看系统配置信息的命令详解

    Linux查看系统配置信息的命令详解

    Linux操作系统由Linux内核和各种外围程序组成, Linux内核是一个特殊的软件程序,用于实现CPU和内存分配,进程调度、设备驱动等核心操作,本文给大家介绍了Linux查看系统配置信息的命令,需要的朋友可以参考下
    2024-04-04
  • Linux下查看.so和可执行文件是否debug编译的方法(必看)

    Linux下查看.so和可执行文件是否debug编译的方法(必看)

    下面小编就为大家带来一篇Linux下查看.so和可执行文件是否debug编译的方法(必看)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Shell脚本批量修改文件后缀名代码分享

    Shell脚本批量修改文件后缀名代码分享

    这篇文章主要介绍了Shell脚本批量修改文件后缀名,问中收集了2个示例,需要的朋友可以参考下
    2014-07-07

最新评论