深入理解 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 的环境不会被改变,适合一次性任务或后台运行的脚本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/472325.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CC6学习记录

🌸 cc6 cc6和cc1的国外链其实后半条链子是一样的,但是cc6的不局限于jdk的版本和commons-collections的版本。 回忆一下cc1的后半条链子: LazyMap.get()->InvokerTransformer.transform() 这里我们就结合了URLDNS链的思路,在…

飞凌嵌入式RK3576核心板已适配Android 14系统

在今年3月举办的RKDC2024大会上,飞凌嵌入式FET3576-C核心板作为瑞芯微RK3576处理器的行业首秀方案重磅亮相,并于今年6月率先量产发货,为客户持续稳定地供应,得到了众多合作伙伴的认可。 FET3576-C核心板此前已提供了Linux 6.1.57…

路漫漫其修远兮,吾将上下而求索---第一次使用github的过程记录和个人感受

文章目录 1.仓库位置2.新建仓库3.配置仓库4.克隆和上传5.推荐文章和我的感受 1.仓库位置 这个仓库的位置就是在我们的这个个人主页的右上角;如果是第一次注册账号的话,这个主页里面肯定是不存在仓库的,需要我们自己手动的进行创建&#xff1…

docker与大模型(口语化原理和实操讲解)

文章目录 一、镜像images1)下载安装2)docker images相关命令(保存、删除、上传、别名、搜索镜像) 二、容器container1)展现所有在跑的容器服务ps2)start /restart / kill / stop /rm 三、dockerfile四、volume五、network六、dock…

《基于Oracle的SQL优化》读书笔记

查看执行计划set autotrace traceonly explain在当前session中将优化器模式改为RULE。alter session set optimizer_modeRULE;统计信息存储在oracle的数据字典里,且从多个维度描述了oracle数据库里相关对象的实际数据量,实际数据分布等详细信息。 -- 对…

css:浮动

网页的本质上就是摆放盒子,把盒子摆到相应的位置上 css提供了三种传统的布局方式: 普通流(标准流):标签按默认方式排列,最基本的布局方式 浮动 定位 实际开发中,一个网页基本包含了三种这种布局…

c++入门--引用与指针,const与引用,NULL与nullptr

1.引用与指针: 1.1引用的介绍: 引用相当于一个变量的别名,向函数传参后或者在main函数中可以直接对这个变量进行操作。 1.2引用的返回: 函数返回的时候是生成了一个临时变量,这个变量具有常性,是不能对这…

单片机智能家居火灾环境安全检测

目录 前言 一、本设计主要实现哪些很“开门”功能? 二、电路设计原理图 电路图采用Altium Designer进行设计: 三、实物设计图 四、程序源代码设计 五、获取资料内容 前言 在现代社会,火灾安全始终是人们关注的重点问题。随着科技的不…

SpringBoot3全面复习

Springboot3 Spring Boot 3是Spring Boot框架的一个主要版本,它基于Spring Framework 6构建,引入了对最新Java版本(如Java 17及以上)的支持,并提供了许多新特性和改进。Spring Boot 3旨在简化Spring应用的初始搭建以及…

海思3403对RTSP进行目标检测

1.概述 主要功能是调过live555 testRTSPClient 简单封装的rtsp客户端库,拉取RTSP流,然后调过3403的VDEC模块进行解码,送个NPU进行目标检测,输出到hdmi,这样保证了开发没有sensor的时候可以识别其它摄像头的视频流&…

哈佛商业评论 | 未来商业的技术趋势:百度李彦宏谈技术如何变革商业

在《哈佛商业评论》的HBR IdeaCast节目中,百度联合创始人、首席执行官兼董事长李彦宏分享了他对人工智能(AI)和其他技术趋势的见解。这期节目讨论了百度如何将生成式AI融入业务,以及这些技术如何重塑我们的生活和工作方式。让我们…

插入排序——希尔排序

插入排序——希尔排序 7.5 插入排序——希尔排序概念和思路参考程序希尔排序的特性总结复杂度稳定性 7.5 插入排序——希尔排序 概念和思路 我们都知道,直接插入排序的时间复杂度为 O ( n 2 ) O(n^2) O(n2),但当数据无限接近有序或本身就是有序的时候&a…

Python小试牛刀:第一次爬虫,获取国家编码名称

使用场景: 需要初始化国家(地区表),字段有国家名称、国家编码等等。 解决方案: 使用requests发送请求,使用bs4解析得到的HTML,打开F12,查看元素,(可以Ctrl…

Java中的集合类与线程安全的讨论

1.ArrayList ArrayList是线程不安全的,可以在单线程中使用,在多线程中可以根据代码选择合适的时机进行加锁,实现线程安全的操作,但对代码能力要求较高。 2.Collections.synchronizedList(new ArrayList) 返回的List中的关键操作…

【数据结构】线性表——栈与队列

写在前面 栈和队列的关系与链表和顺序表的关系差不多,不存在谁替代谁,只有双剑合璧才能破敌万千~~😎😎 文章目录 写在前面一、栈1.1栈的概念及结构1.2、栈的实现1.2.1、栈的结构体定义1.2.2、栈的初始化栈1.2.3、入栈1.2.4、出栈…

A030-基于Spring boot的公司资产网站设计与实现

🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 赠送计算机毕业设计600…

企业生产环境-麒麟V10(ARM架构)操作系统部署kafka高可用集群

前言:Apache Kafka是一个分布式流处理平台,由LinkedIn开发并捐赠给Apache软件基金会。它主要用于构建实时数据流管道和流应用。Kafka具有高吞吐量、可扩展性和容错性的特点,适用于处理大量数据。 以下是Kafka的一些核心概念和特性&#xff1…

供应链管理、一件代发系统功能及源码分享 PHP+Mysql

随着电商行业的不断发展,传统的库存管理模式已经逐渐无法满足市场需求。越来越多的企业选择“一件代发”模式,即商家不需要自己储备商品库存,而是将订单直接转给供应商,由供应商直接进行发货。这种方式极大地降低了企业的运营成本…

机器学习 ---线性回归

目录 摘要: 一、简单线性回归与多元线性回归 1、简单线性回归 2、多元线性回归 3、残差 二、线性回归的正规方程解 1、线性回归训练流程 2、线性回归的正规方程解 (1)适用场景 (2)正规方程解的公式 三、衡量…

Unity类银河战士恶魔城学习总结(P127 Stat ToolTip属性提示)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了把鼠标放到属性上面就会显示属性的作用 UI_StatToolTip.cs 这段代码实现了一个UI提示框(ToolTip)功能…