如何识别 Bash 脚本是源自还是直接执行

2023-10-27

Bash 脚本是一个强大的工具,开发人员可以利用它在 Unix 和 Linux 系统上自动执行任务。一种常见的用例是在另一个脚本中获取一个脚本,从而允许在它们之间共享变量和函数。但有时,了解 Bash 脚本是否已获取或直接执行是至关重要的。这些知识有助于根据程序的调用方法控制程序的流程。

本指南将探讨如何识别 Bash 脚本是直接获取的还是直接执行的。

了解 Bash 脚本的直接执行和来源

在我们深入检测脚本调用方法之前,让我们先澄清一下 Bash 脚本的来源和直接执行之间的区别。

  • 直接执行:当您直接运行脚本时,系统会生成一个新的 shell 进程并在这个新 shell 中执行脚本。脚本中定义的变量和函数仅在该新 shell 的范围内可用,并且在脚本执行完成后将丢失。
  • Sourcing:另一方面,如果您获取脚本,它将在同一 shell 中执行。这意味着即使脚本完成执行后,脚本定义或修改的任何变量或函数仍将在 shell 中保持可用。脚本的来源是通过 source 命令或点运算符 (.) 来实现的。

在 Bash 中检测源脚本和直接执行的脚本

要确定脚本是否是源代码或直接运行,我们可以使用 $0 和 BASH_SOURCE 变量。

在巴什中,`$0`保存正在执行的脚本的名称。当直接运行脚本时,`$0`将包含脚本本身的名称。

`BASH_SOURCE`是一个保存源历史记录的数组变量,其中`${BASH_SOURCE[0]}`是当前子程序调用的源,`${BASH_SOURCE[1]}`是当前子程序的调用者的来源,依此类推。如果有脚本来源,`${BASH_SOURCE[0]}`将包含脚本本身的名称。

让我们看看如何利用这些变量来检测脚本是否正在获取或直接运行:


if [[ "${BASH_SOURCE[0]}" == "${0}" ]]
then
    echo "Script is being run directly."
else
    echo "Script is being sourced."
fi

在此代码中,如果`${BASH_SOURCE[0]}` equals `$0`,然后直接运行脚本。否则,它正在被采购。

了解如何调用脚本的含义

了解脚本的调用方式在多种情况下都非常有用。例如,您可能有一个脚本,既可以为其函数获取资源,也可以直接为其命令行界面运行。通过检测调用方法,您可以相应地控制脚本的行为。

这是一个简单的例子:


# function definitions...
function1() { ... }
function2() { ... }

# if script is run directly, execute a command
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
    function1
    function2
fi

在这个脚本中,功能1 and function2仅当直接运行脚本时才会执行。如果是源代码,则仅处理函数定义,而不执行任何命令。

结论

Bash 提供了一些工具来确定脚本是来源还是直接运行。有了这些知识,开发人员就可以根据调用方法控制脚本的行为,从而产生更加灵活和模块化的代码。与任何编程概念一样,巩固理解的最佳方法是实践,因此请考虑如何在您自己的 Bash 脚本中应用此技术。

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

如何识别 Bash 脚本是源自还是直接执行 的相关文章

随机推荐

  • 王者体验服服务器注册人数已满,王者官方大厅奖励有多难获得?服务器直接崩溃,玩家:别发红包了...

    可乐要加冰 乔妹在你心 大家好我是小乔妹 每天为您分享有趣的王者资讯 感谢您的关注 王者荣耀一直以来都有许许多多的活动 有限时活动也有长久活动 但官方专属大厅奖励活动确实王者史上第一次奖励 因此就有很多玩家期待这次专属活动的福利是什么 这次
  • xp系统打开ping服务器地址,WinXP如何用批处理文件鉴定IP地址Ping是否连通

    内容来源 系统之家 今天来聊聊一篇关于WinXP如何用批处理文件鉴定IP地址Ping是否连通的文章 现在就为大家来简单介绍下WinXP如何用批处理文件鉴定IP地址Ping是否连通 希望对各位小伙伴们有所帮助 鉴定方法 打开记事本 在窗口中输
  • 2021年10月程序员薪资出炉,你在哪个层级?

    叮咚 10月份程序员薪资表新鲜出炉 先从地域上来看 城市的平均工资排行 依然是北上深占据着前三位 其中北京以18094 3的平均工资成为了众多城市的天花板 接下来我们一起来看看新出炉的 10 月份程序员工资表 城市 10月程序员薪资排名靠前
  • python爬虫爬取高清图片——爬虫入门

    自动抓取某图片网站高清壁纸并下载保存 使用requests请求网页 bs4解析数据 话不多说直接看代码 刚学不久欢迎指点 codeing utf 8 Time 2022 11 7 15 22 Author 摸摸头发在不在 File geti
  • Hexagon GDB Debugger介绍(14)

    Hexagon GDB Debugger介绍 14 2 9 2 连续和单步调试 2 9 2 连续和单步调试 连续意味着恢复程序执行 直到程序正常完成 相比之下 单步调试意味着只执行程序的一个 step 其中 step 可能意味着一行源代码或
  • 数字信号处理实验(三):离散时间傅里叶变换

    1 dfdt function X dtft x n w 计算离散时间付里叶变换 X dtft x n w X 在w频率点上的DTFT数组 x n点有限长度序列 n 样本位置向量 w 频率点位置向量 X x exp j n w 2 idfd
  • vscode配置 SSH 链接服务器

    什么是SSH Secure Shell 安全外壳协议 简称SSH 是一种加密的网络传输协议 可在不安全的网络中为网络服务提供安全的传输环境 SSH通过在网络中创建安全隧道来实现SSH客户端与服务器之间的连接 SSH最常见的用途是远程登录系统
  • ICCV 2019 COCO & Mapillary挑战赛冠军团队技术分享

  • Data URI scheme

    什么是Data URI Scheme data URI scheme 允许我们使用内联 inline code 的方式在网页中包含数据 目的是将一些小的数据 直接嵌入到网页中 从而不用再从外部文件载入 常用于将图片嵌入网页 HTML中网页图
  • 西米支付:数字人民币常识普及

    1 1 什么是数字人民币 数字人民币 英文简称 e CNY 是由人民银行发行的数字形式的法定货币 由指定 运营机构参与运营 以广义账户体系为基础 支持银行账户松耦合功能 意味着用户既可 以选择将数字人民币钱包与自己已经开设的银行账户进行绑定
  • Linux基础知识专栏-进程通信

    一 通信原理及基础知识 通讯原理 服务端创建一个命名管道 并监控管道中是否存在内容 倘若有则读取 或者根据内容进行相应的响应 客户端判断是否存在命名管道 往管道中输入数据 服务端即可接收到数据 单向通讯实现 客户端写入 服务端读取 serv
  • 《14天从0到1学Java》第一天之07Java变量和常量

    这个是一套系列教程 一共14天 每天8篇 每篇需要5分钟 也就是说 你需要每天抽出40分钟来看教程 坚持14天就可以 轻松玩转JavaSE 我是Feri 我为自己代言 专注IT职场研发和教育N年 希望对于你的入门 有所帮助 本篇目录 一 常
  • JAVASE

    JAVASE 主要内容 API使用 Object类 String类 今日学习需加强部分 今 学习 情记录 写给明天的 第一章 API 1 1 概述 API Application Programming Interface 应用程序编程接口
  • Go_IO操作文件/目录

    创建 删除目录 Go语言IO操作可以通过os包或bufio包 bufio是带缓冲的 创建目录 os Mkdir 创建单个目录 如果存在则失败 os MkdirAll 创建多级目录 如果存在则不操作 name perm 文件路径 操作权限 f
  • coco-annotator的安装与使用

    文章目录 coco annotator的安装与使用 1 coco annotator是什么 2 coco annotator可以做什么 3 coco annotator的安装 3 1 先决条件 3 2 coco annotator的下载与安
  • 什么是JSON数据格式?

    一 什么是 JSON JSON 是 JavaScript 对象表示法 全称JavaScript Object Notation 类似于XML JSON 是轻量级的文本数据交换格式 它比 XML 更小 更快 更易解析 JSON 独立于语言 J
  • 如何在 Debian 10 上安装和配置 Apache

    先决条件 您必须具有 sudo 权限的 SSH 访问服务器才能在 Debian 10 上安装 Apache Web 服务器 在 Debian 10 上安装 Apache 首先 通过 SSH 登录到 Debian 10 系统并更新 Apt 缓
  • 如何列出 Ubuntu 上存储库中的所有可用软件包

    APT or 高级封装工具是一个软件包 用于在基于 Debian 的系统上安装 更新和删除软件包 它是基于 Ubuntu 和 Debian 的系统上的默认包管理器 这apt apt get and apt cache是快速使用的命令来管理系
  • 解决“错误 2006 (HY000):MySQL 服务器已消失”

    你熟悉吗 第 XXX 行出现错误 2006 HY000 MySQL 服务器已消失 错误信息 如果您一直在使用 MySQL 并遇到此错误 它可能会令人沮丧甚至令人畏惧 特别是当您不确定如何解决它时 这份综合指南将帮助您了解此错误是什么 为什么
  • 如何识别 Bash 脚本是源自还是直接执行

    Bash 脚本是一个强大的工具 开发人员可以利用它在 Unix 和 Linux 系统上自动执行任务 一种常见的用例是在另一个脚本中获取一个脚本 从而允许在它们之间共享变量和函数 但有时 了解 Bash 脚本是否已获取或直接执行是至关重要的