当前位置: 首页 > news >正文

深入理解 source 和 sh、bash 的区别

1 引言

在日常使用 Linux 的过程中,脚本的执行是不可避免的需求之一,而 sourceshbash 等命令则是执行脚本的常用方式。尽管这些命令都能运行脚本,但它们之间的执行方式和效果却有着显著的区别。这些区别可能会影响到脚本的环境变量、工作目录、甚至当前 shell 的状态。因此,理解 sourceshbash 等命令在执行脚本时的差异,对于有效管理和维护系统环境、编写灵活的自动化脚本非常重要。

在本文中,我们将深入探讨 sourceshbash 的区别,包括它们的执行环境、变量传递、输出行为等方面。通过了解这些区别,你将能够更合理地选择适合的命令来执行脚本,从而在实际工作中更加高效地管理 Linux 系统环境。


2 执行环境与变量传递的差异

在 Linux 中使用 sourceshbash 等命令执行脚本时,执行环境的不同导致了变量和环境传递方式的差异。这些差异影响到脚本中的变量、环境设置等在当前 shell 中的作用。以下是它们的主要区别。

2.1 执行环境的差异

  • source 命令

    • source(或 .)是在当前 shell 环境中执行脚本内容。脚本中的所有变量定义、函数、环境变量修改等都会在当前 shell 中生效,并且在脚本执行完毕后依然保留在当前环境中。
    • 这种执行方式相当于在当前 shell 中逐行执行脚本内容,因此会直接影响当前 shell 的状态。
  • shbash 命令

    • 使用 sh script.shbash script.sh 执行脚本时,系统会启动一个新的子 shell 来运行脚本。在子 shell 中执行的所有变量和环境修改仅在子 shell 内生效,不会影响当前的父 shell。
    • 当子 shell 执行完毕后,它会关闭,所有在脚本中创建或修改的变量和环境都会随之销毁。

2.2 变量和环境的传递差异

由于执行环境的不同,sourceshbash 在变量和环境的传递方面也有差异:

  • source 命令

    • 在当前 shell 中执行脚本,脚本中的变量和环境设置会直接在当前 shell 中生效。这意味着使用 source 命令可以将脚本中的变量和环境配置保留在当前 shell 中,影响后续的操作。
    • 例如,通过 source 命令执行脚本后,定义的变量或改变的工作目录会保留在当前会话中。
  • shbash 命令

    • 在子 shell 中执行脚本,脚本中的变量和环境仅在子 shell 内部生效,无法传递回当前 shell。
    • 只有提前使用 export 设置为环境变量的值,才会从父 shell 传递给子 shell,普通变量无法传递。这意味着在子 shell 中执行的脚本对当前 shell 没有影响,适合独立运行的任务或一次性任务。

2.3 示例对比

假设有一个脚本 script.sh,内容如下:

# script.sh
VAR="Hello, World"
export ENV_VAR="Exported Variable"
cd /tmp
  • 使用 source 执行
    Pasted image 20241115110351

    在这种情况下,source 会将 VARENV_VAR 变量直接传递到当前 shell 中,并改变了当前目录。执行后,这些更改会保留在当前 shell 中,影响后续的操作。

  • 使用 bash 执行
    Pasted image 20241115110433

    使用 bash 启动子 shell 执行脚本,脚本中的 VARENV_VAR 变量及目录更改都仅在子 shell 中生效,不会影响当前的父 shell。执行结束后,变量在当前 shell 中不可访问,目录也未发生变化。

2.4 总结

  • source 在当前 shell 中执行脚本,直接影响当前 shell 的变量和环境设置。
  • shbash 在子 shell 中执行脚本,不会影响当前 shell,只有 export 的环境变量会传递到子 shell。

3 输出和影响范围的差异

在使用 sourceshbash 执行脚本时,输出行为和影响范围也存在差异。这种差异主要体现在脚本的输出显示、错误处理以及对当前 shell 的持久影响方面。

3.1 输出的显示

  • source 命令

    • source 命令在当前 shell 中直接执行脚本内容,因此脚本中的所有输出会立即在当前 shell 的终端窗口中显示,就像你手动输入这些命令一样。
    • 如果脚本包含 echoprintf 等输出命令,它们的输出会直接显示在当前 shell 中。并且因为是在当前 shell 中运行,所有输出和执行步骤都可以在当前 shell 直接看到和调试。
  • shbash 命令

    • 当使用 sh script.shbash script.sh 执行脚本时,输出同样会显示在当前终端窗口中,但因为是在子 shell 中执行,它与当前 shell 相对隔离。
    • 任何标准输出(stdout)和标准错误输出(stderr)都会在子 shell 中产生,但仍会显示在当前的终端上。这种方式的输出行为与 source 看起来类似,但在调试和环境影响上不同。

3.2 对当前 shell 的影响

  • source 命令

    • 如果脚本中包含 exit 命令,执行 source 会导致当前 shell 直接退出。因此在使用 source 时要谨慎处理 exit 等可能影响当前 shell 的指令。
  • shbash 命令

    • 如果脚本中包含 exit 命令,只会导致子 shell 退出,不会影响当前的父 shell。

3.3 错误处理的影响

  • source 命令

    • 由于 source 在当前 shell 中运行,脚本中的错误会直接影响当前 shell。如果脚本出错,可能导致当前 shell 产生意外行为,甚至需要手动干预才能恢复正常状态。
    • 脚本中的错误会直接在当前 shell 中显示出来,可以立即调试和修复。
  • shbash 命令

    • 使用 shbash 执行脚本时,错误仅在子 shell 中发生,不会对当前 shell 产生直接影响。
    • 如果脚本运行失败,子 shell 会处理错误并退出,但当前 shell 不会受到影响。这种方式适合执行不希望影响当前 shell 的任务,特别是那些可能失败或包含危险命令的脚本。

3.4 小结

  • source 会在当前 shell 中直接显示脚本输出,所有环境更改和错误直接影响当前 shell。
  • shbash 在子 shell 中执行,输出显示在当前终端,但对当前 shell 没有环境影响,错误也仅在子 shell 内部处理。

4 使用场景与总结

在实际工作中,选择 sourceshbash 来执行脚本应视具体需求而定。理解它们在执行环境、变量传递、输出和影响范围上的差异,有助于我们在不同场景中做出更合适的选择。

4.1 使用 source 的场景

当需要在当前 shell 中定义变量、加载环境设置、或执行会影响当前 shell 的配置脚本时,source 是更好的选择。比如,加载环境配置文件(如 source ~/.bashrc),或者定义会在当前会话中持续使用的变量和函数。因为 source 会直接在当前 shell 中执行脚本内容,所有环境变量和配置修改会对后续命令产生直接影响。

4.2 使用 shbash 的场景

当希望脚本执行的内容与当前 shell 相对隔离,或者不希望它修改当前环境时,shbash 更为合适。执行独立的自动化任务、批处理脚本,或可能出错而不希望影响当前 shell 的任务时,可以使用 sh script.shbash script.sh。这些命令会在子 shell 中运行脚本,确保当前 shell 的环境不会被改变,适合一次性任务或后台运行的脚本。

相关文章:

深入理解 source 和 sh、bash 的区别

1 引言 在日常使用 Linux 的过程中,脚本的执行是不可避免的需求之一,而 source、sh、bash 等命令则是执行脚本的常用方式。尽管这些命令都能运行脚本,但它们之间的执行方式和效果却有着显著的区别。这些区别可能会影响到脚本的环境变量、工作…...

k8clone二进制工具迁移k8s中的无状态应用

1 概述 k8clone是一个简便的Kubernetes元数据克隆工具,它可以将Kubernetes元数据(对象)保存为本地压缩包,在恢复时可将这些元数据恢复到目标集群中(已存在的资源不会被覆盖)。它不依赖远程存储&#xff0c…...

VPI photonics的一些使用经验(测相位 快速搜索)持续更新

1.使用FuncSinEl模块的注意事项: 2.在VPI player(示波器)测电信号相位时候,可以使用正则表达式,快速搜索。 比如我要搜索以30开头的数据,输入: ^30 其他的正则表达式不适用,比如以…...

DBeaver 连接 OceanBase Oracle 租户

DBeaver 是一款通用的数据库工具软件,支持任何具有JDBC驱动程序的数据库。DBeaver 需要 Java 运行环境的支持。截稿时 DBeaver 24.0.0 版本默认提供的 OceanBase 驱动是连接 MySQL 的,想连接 Oracle 租户需要新建一个驱动器使用。 下载数据库驱动包 1、…...

QT_CONFIG宏使用

时常在Qt代码中看到QT_CONFIG宏,之前以为和#define、DEFINES 差不多,看了定义才发现不是那么回事,定义如下: 看注释就知道了QT_CONFIG宏,其实是:实现了一个在编译时期安全检查,检查指定的Qt特性…...

力扣(leetcode)题目总结——辅助栈篇

leetcode 经典题分类 链表数组字符串哈希表二分法双指针滑动窗口递归/回溯动态规划二叉树辅助栈 本系列专栏:点击进入 leetcode题目分类 关注走一波 前言:本系列文章初衷是为了按类别整理出力扣(leetcode)最经典题目&#xff0c…...

如何处理 iOS 客户端内 Webview H5 中后台播放的音视频问题

目录 问题描述Page Visibility API 的应用什么是 Page Visibility API?使用 Page Visibility API 暂停音视频完整解决方案1. 监听媒体的播放和暂停事件2. 防止自动播放3. 结合 Intersection Observer 进行媒体控制4. 手动处理应用生命周期中的事件 问题描述 在 iOS…...

C++的一些模版

1、不限制次数的输入数据 vector<int> nums;int num;while (cin >> num) {nums.push_back(num);if (cin.get() \n) break;}2、取模模版 template<int kcz> struct ModInt { #define T (*this)int x;ModInt() : x(0) {}ModInt(int y) : x(y > 0 ? y : y…...

spring boot整合https协议

整体目录 1. 生成SSL证书 首先&#xff0c;使用keytool生成一个自签名证书。打开命令行工具并运行以下命令&#xff1a; keytool -genkeypair -alias myserver -keyalg RSA -keysize 2048 -keystore keystore.jks -validity 365 这将创建一个名为keystore.jks的文件&#xf…...

服务器开机即占用大量内存,解决

1.服务器开机两分钟不到&#xff0c;内存使用飙升 [rootlocalhost ~]# top #查看是否有了明显的内存占用程序 2.上述未果&#xff0c;查看是否有违规的开机自启项 [rootlocalhost ~]# chkconfig --list 3.上述无果&#xff0c;查看开启启动加载项内容 上网搜后&#xff…...

Keil uvision的edition

0 Preface/Foreword 0.1 参考网址 https://zhuanlan.zhihu.com/p/456069876 1 Keil版本介绍 版本介绍&#xff1a; Keil Lite&#xff08;免费版&#xff09;&#xff1a;最多32KB代码&#xff0c;无法使用中间件Keil Essential&#xff08;基础版&#xff09;&#xff1a;没…...

[每周一更]-(第123期):模拟面试|消息队列面试思路解析

文章目录 22|消息队列:消息队列可以用来解决什么问题?1. 你用过消息队列吗?主要用来解决什么问题?异步、削峰和解耦你能各举一个例子吗?2. 你用的是哪个消息队列?为什么使用它而不用别的消息队列?3. 为什么你一定要用消息队列?不用行不行?不用有什么缺点?4. 在对接多…...

游戏引擎学习第12天

视频参考:https://www.bilibili.com/video/BV1yom9YnEWY 这节没讲什么东西&#xff0c;主要是改了一下音频的代码 后面有介绍一些alloc 和malloc,VirtualAlloc 的东西 _alloca 函数&#xff08;或 alloca&#xff09;分配的是栈内存&#xff0c;它的特点是&#xff1a; 生命周…...

深入理解Flutter生命周期函数之StatefulWidget(一)

目录 前言 1.为什么需要生命周期函数 2.开发过程中常用的生命周期函数 1.initState() 2.didChangeDependencies() 3.build() 4.didUpdateWidget() 5.setState() 6.deactivate() 7.dispose() 3.Flutter生命周期总结 1.调用顺序 2.函数调用时机以及主要作用 4.生…...

413: Quick Sort

解法&#xff1a; #include <bits/stdc.h> using namespace std; const int N1e55; int a[N]; int n;int main(int argc, char** argv) {cin>>n;for (int i0;i<n;i) cin>>a[i];sort(a,an);for (int i0;i<n;i) cout<<a[i]<<" "…...

vue之axios根据某个接口创建实例,并设置headers和超时时间,捕捉异常

import axiosNew from axios;//给axios起个别名//创建常量实例 const instanceNew axiosNew.create({//axios中请求配置有baseURL选项&#xff0c;表示请求URL的公共部分&#xff0c;url baseUrl requestUrlbaseURL: baseURL,//设置超时时间为20秒timeout: 20000,headers: {…...

Pandas数据透视表:交叉分析与聚合计算

大家好&#xff0c;在数据分析中&#xff0c;数据透视表&#xff08;Pivot Table&#xff09;是一种强大的工具&#xff0c;用于交叉分析和聚合计算。Pandas库中的数据透视表功能&#xff0c;使我们能够在多维数据中快速生成汇总表、统计特定维度的聚合数据&#xff0c;帮助揭示…...

软件设计师考试大纲

文章目录 一 、考 试 说 明1. 考试目标2. 考试要求3. 考试科目设置 二、考 试 范 围考试科目1:计算机与软件工程知识1. 计算机系统基础知识1.1计算机内数据的表示及运算1.2 其他数学基础知识1.3 计算机硬件基础知识1.3.1 计算机系统的组成、体系结构分类及特性1.3.2 存储系统1.…...

一文说清C++类型转换操作符(cast operator)

一 前言 大家在编程时&#xff0c;一定会遇到要做类型转换的应用场景。 但是&#xff0c;C风格的类型转换太强大&#xff0c;太危险&#xff0c;它允许将一个给定类型转换成我们想要的任何其他类型。 所以在C中&#xff0c;提供了一些更安全和更明确的类型转换操作符&#xff…...

MOSFET电路栅源极GS之间并联电容后,MOS炸管原因分析

1、前言 在介绍&#xff0c;在进行MOSFET相关的电路设计时&#xff0c;可能会遇到MOSFET误导通的问题&#xff0c;为了解决此问题&#xff0c;我们提出了两种方法&#xff0c;一种是增大MOSFET栅极串联电阻的阻值&#xff0c;另外一种是在MOSFET栅-源极之间并联一个电容&#…...

开发者的第二曲线:2026年最赚钱的5个技术副业

在技术范式加速重构的2026年&#xff0c;软件质量保障的重要性已从“成本中心”跃升为“价值中心”。对于敏锐的软件测试从业者而言&#xff0c;这不仅是职业的深化&#xff0c;更是将专业壁垒转化为财富增长的绝佳契机。传统的“接私活”模式正在被更具复利效应和杠杆价值的“…...

Java中如何实现Excel跨工作表数据复制

本文介绍了如何在Java程序中有效地复制Excel工作表中的数据。许多Java开发人员需要将数据从一个工作表复制到另一个工作表。本文提供了一个代码示例来帮助您解决这个问题。核心是如何在Java中有效地复制Excel工作表中特定区域的数据。下面的例子是使用Java库&#xff08;具体的…...

CloudFlare Workers实现高级邮箱转发:过滤垃圾邮件+自动分类实战

CloudFlare Workers实现高级邮箱转发&#xff1a;过滤垃圾邮件自动分类实战 邮箱已经成为现代人工作和生活中不可或缺的工具&#xff0c;但随之而来的垃圾邮件、广告推广和各类通知也让收件箱变得杂乱无章。对于开发者和技术爱好者来说&#xff0c;传统的邮箱转发功能往往不能满…...

Umi-OCR终极指南:3分钟掌握免费离线OCR文字识别

Umi-OCR终极指南&#xff1a;3分钟掌握免费离线OCR文字识别 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片&#xff0c;PDF文档识别&#xff0c;排除水印/页眉页脚&#xff0c;扫描/生成二维码。内置多国语言库。 …...

NCCL中RoCE与RDMA的深度解析:如何优化分布式训练网络性能

1. 为什么RoCE和RDMA对分布式训练如此重要&#xff1f; 第一次接触分布式训练时&#xff0c;我盯着日志里不断跳动的通信耗时直发愁。8块GPU明明都在满负荷运转&#xff0c;但总训练时间就是比单卡8要长不少。后来用NVIDIA的Nsight工具一分析&#xff0c;发现超过30%的时间都花…...

内网渗透实战:利用SSH密钥实现Linux主机间横向移动

1. SSH密钥横向移动的核心原理 当你第一次接触内网渗透时&#xff0c;可能会被各种复杂的技术术语吓到。其实SSH密钥横向移动的原理非常简单&#xff1a;就像用钥匙开锁一样&#xff0c;只要拿到目标主机的SSH私钥&#xff0c;就能像合法用户一样登录系统。我在实际渗透测试中发…...

如何为华硕笔记本安装轻量级性能控制工具:G-Helper完整指南

如何为华硕笔记本安装轻量级性能控制工具&#xff1a;G-Helper完整指南 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Stri…...

YOLOv5后处理升级指南:一文搞懂NMS、Soft-NMS和CIoU-NMS怎么选

YOLOv5后处理优化实战&#xff1a;NMS算法选型与性能调优指南 当你的YOLOv5模型完成训练后&#xff0c;最后一个关键环节是后处理优化——这直接决定了检测框的质量和最终性能表现。面对琳琅满目的NMS变种和IoU计算方法&#xff0c;工程师们常常陷入选择困难&#xff1a;Soft-N…...

RTL8201F PHY芯片替换调试:从时钟异常到Ping通实战

1. 低成本PHY芯片替换的背景与挑战 最近接手了一个嵌入式以太网项目&#xff0c;甲方对成本控制非常严格&#xff0c;要求我们把原本使用的LAN8742 PHY芯片替换成更便宜的RTL8201F。这个需求听起来简单&#xff0c;但实际操作起来却遇到了不少坑。RTL8201F确实便宜不少&#xf…...

RMBG-2.0功能体验:单图处理、拖拽上传、对比预览全解析

RMBG-2.0功能体验&#xff1a;单图处理、拖拽上传、对比预览全解析 1. 开箱即用的背景移除神器 在电商运营、平面设计和内容创作领域&#xff0c;背景移除是一个高频且耗时的需求。传统方法要么依赖专业软件&#xff08;如Photoshop&#xff09;手动操作&#xff0c;要么使用…...