Shell—关于source,bash如何执行

2023-11-17

  通过对一个脚本问题的分析,发现了自己的一个知识误区,我想,有必要写篇博客总结一下。

关于source

  source test.sh 与 . test.sh 二者用法相同。是读取脚本test.sh中的内容,依次在当前脚本中执行,且不会建立新的子shell去执行。被引用脚本 test.sh中的所有新建、改变变量的语句都会保存在当前shell里面,并被执行。
   一般,在被引用脚本 test.sh中会封装一个公用的代码或是校验类的接口函数,供其他脚本调用。
  尤其需要理解区分的是,source不同于 “./ test.sh” 和 “/bin/bash test.sh”,此二者有本质的区别,后者是在当前脚本中执行子shell,会产生新的进程来执行,而且在父shell中不能调用子shell中包含的函数接口。而source之后的文件内容已被加载到当前脚本中,就可以调用其内部定义的函数。

本文测试的 test.sh 脚本如下,作为被引用的脚本文件

#!/bin/bash
echo "Enter test.sh"
function func1()
{
    echo "enter function 1"
}
function func2()
{
    echo " $1: source $2 "
    echo "Exit test.sh"
    exit 0
}
echo "Exit test.sh ~~~"

当执行exec.sh脚本时,exec.sh 中执行 ./test.sh,结果如下
@xiaoma
验证:在父shell中不能调用子shell中包含的函数接口

bash如何执行

  通过分析源码,bash是把执行的shell中的内容存储到hash表。source作为内置命令,其实现也在bash源码中(builtins/source.def 内置方法的文件都在builtins目录),当bash执行到source命令时,会将引用的脚本文件内容读入一个缓冲区,保存于一段临时开辟的hash表中,然后通过调用函数push_scope(VC_BLTNENV, tempporary_env)push到当前脚本的上下文中,在哪里引用,就在哪加入当前脚本的上下文。最后,bash依次往下执行当前脚本。
本文中测试的当前脚本 source.sh 如下:

#!/bin/bash

if [ $# -ne 1 ]
then
	echo "Usage: $0 source_file"
fi
source_file=$1
echo "First source $source_file"
source $source_file
echo "Exec func1 function"
func1
echo "Second source $source_file"
. $source_file
echo "Exec func2 function"
func2 "$0 $source_file"
echo "Exit source.sh"  # func2 中存在 exit 0, bash执行不到这里,因此不会打印

在命令行执行 ./source.sh test.sh 打印如下:
@xiaoma
Bash执行过程如下:
@xiaoma
从上图看得出来,每一次source,当前执行脚本中就会重新读取被引用脚本 test.sh的内容并执行,因此在实际写shell时,要避免多次source一个文件,此处是为了示例source执行的过程。

  对于简单的命令,要更加理解到位,不然还是会犯一些低级的小错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Shell—关于source,bash如何执行 的相关文章

随机推荐

  • nginx配置非80端口

    user nobody worker processes 2 events worker connections 1024 http include mime types default type application octet str
  • leetcode刷题python之有效的括号

    class Solution def isValid self s str gt bool dict stack for i in s if i in dict top stack pop if stack else if dict i t
  • 微信小程序:消息提示框(wx.showToast)和 交互提示框(wx.showModal)

    摘要 有时需要提示框来提醒我们相应信息 以及交互提示框来让我们是否继续进行操作 一 消息提示框 1 参数介绍 消息提示框只有提示作用 不能交互 函数是wx showToast 下面列出几个主要且常用参数 2 代码 wx showToast
  • 如何把IE浏览器快速变成灰色来哀悼在汶川地震中遇难的同胞们!

    如何把IE浏览器快速变成灰色来哀悼在汶川地震中遇难的同胞们 把IE浏览器快速变成灰色只要作以下二点即可 第一点 在html页面中 在body中加入下面语句 第二点 在css控制表中 加入下面语句 html filter progid DXI
  • c++11中四种类型转换

    1 static cast 功能 完成编译器认可的隐式类型转换 格式type1 a type2 b staic cast
  • HiveQL中如何排查数据倾斜问题

    如果某个key下记录数远超其他key 在join或group的时候可能会导致某个reduce任务特别慢 本文分析下join的场景 本例子SQL如下 查询每个appid打开的次数 需要排除掉作弊的imei 说明 表cheat imei 750
  • Basic Level 1016 部分A+B (15分)

    题目 正整数 A A A的 D A D A DA 为1位整数 部分 定义为由 A
  • Unity进阶--声音管理器学习笔记

    文章目录 声音管理器 using System Collections using System Collections Generic using UnityEngine public class AudioManager MyrSing
  • 自定义注解及应用场景

    自定义注解及应用场景 深圳蜗牛学苑 课程目标 理解自定义注解概念 掌握自定义注解语法 自定义注解场景中的使用 熟练掌握自定义注解 AOP的使用方式 一 自定义注解 我们回顾一下方法的重写 会发现有 Override 我们把它称为重写的注解
  • 【2】样本不均衡问题及其解决办法

    5 损失函数 在机器学习中 可以通过修改模型中的 class weight 参数 从而调节不均衡样本的惩罚权重 5 1 LogisticRegression 逻辑回归模型 代码 lr l2 LogisticRegression penalt
  • Windows内核--子系统(3.5)

    到底什么是子系统 子系统是用户层概念 在Windows内核之上 如果想要执行类UNIX应用程序 就是POSIX子系统 如果要类似OS 2环境 就是OS 2子系统 如何能模拟出不同子系统呢 一般需要子系统用户态应用程序和相关DLL支援 对于W
  • AI模型推理(4)—— 认识ServingRuntime

    参考 Serving Runtimes KServe Documentation Website 模型推理服务化 如何基于Triton开发自己的推理引擎 知乎 GitHub triton inference server server Th
  • overleaf常见使用操作

    overleaf常见使用操作 数学符号的使用 图片的插入 表格的插入 参考文献 总结 数学符号的使用 链接 最全overleaf在线编辑数学公式以及遇到错误的解决方法 这里主要记一下集合的使用 并集 A cup B D D 1
  • 记一次Prometheus监控下的“内存飙升”事件

    问题描述 尝试定位问题 错误的表达式 重叠的时间序列 Prometheus的高可用机制 联邦集群 修改PromQL表达式 结语 本文将介绍一次在使用Prometheus过程中由于表达式错误引发的问题 以及解决过程 问题描述 项目上的API用
  • Json的float单精度浮点数类型支持Can't assign value '11.88' (type System.Double) to type System.Single

    今天遇到个问题Can t assign value 11 88 type System Double to type System Single litjson不支持单精度浮点数float 只用修改JsonMapper cs脚本就可以 一共
  • 机器学习之从基础数学深入剖析逻辑回归(案例理论相结合)

    逻辑回归 一 从回归问题到分类问题 回归基础请见上一篇文章 https blog csdn net sjjsaaaa article details 115967347 1 机器学习中的分类问题 事物的类别 正确的分类观是建立科学体系 训练
  • 数字系统的信息表示

    数字系统的信息表示 1 什么是信息 2 数字系统是如何表示一个连续值的信息 3 使用数字信号的优势 4 将模拟信号表示成数字信号形式过程 5 为什么数字系统要采用二进制 6 噪声容限 1 什么是信息 信息是对物质世界与人类社会中存在的各种各
  • 网络安全中的欺骗攻击与防御技术

    在Internet上计算机之间相互进行的交流建立在两个前提之下 认证 信任 认证是网络上的计算机用于相互间进行识别的一种鉴别过程 经过认证的过程 获准相互交流的计算机之间就会建立起相互信任的关系 信任和认证具有逆反关系 即如果计算机之间存在
  • 介值定理究竟在讲什么?

    介值定理 书本上的定义 翻译成人话就是 函数最原始的定义 我们初中就知道 一个函数最根本的性质就是 函数值 自变量值 一一对应 所以介值定理就是在反复说一件事 一个数如果属于值域 在定义域内 一定能够找到一个 自变量 与其对应 当然这个结论
  • Shell—关于source,bash如何执行

    通过对一个脚本问题的分析 发现了自己的一个知识误区 我想 有必要写篇博客总结一下 关于source source test sh 与 test sh 二者用法相同 是读取脚本test sh中的内容 依次在当前脚本中执行 且不会建立新的子sh