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

devtools/2024/11/17 22:29:03/

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,内容如下:

bash"># 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 中执行脚本内容,所有环境变量和配置修改会对后续命令产生直接影响。

bash__106">4.2 使用 shbash 的场景

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


http://www.ppmy.cn/devtools/134807.html

相关文章

YOLOv8改进,YOLOv8通过RFAConv卷积创新空间注意力和标准卷积,包括RFCAConv, RFCBAMConv,二次创新C2f结构,助力涨点

摘要 空间注意力已广泛应用于提升卷积神经网络(CNN)的性能,但它存在一定的局限性。作者提出了一个新的视角,认为空间注意力机制本质上解决了卷积核参数共享的问题。然而,空间注意力生成的注意力图信息对于大尺寸卷积核来说是不足够的。因此,提出了一种新型的注意力机制—…

速盾:cdn 支持 php 吗?

在网络开发中,PHP 是一种广泛使用的服务器端脚本语言,用于创建动态网页和 web 应用程序。CDN(Content Delivery Network,内容分发网络)在内容分发方面具有强大的功能,那么它是否支持 PHP 呢? C…

3D Gaussian Splatting 代码层理解之Part2

现在让我们来谈谈高斯分布。我们已经在Part1介绍了如何根据相机的位置获取 3D 点并将其转换为 2D。在本文中,我们将继续处理高斯泼溅的高斯部分。这里用到的是 GitHub 中part2. 我们在这里要做的一个小改动是,我们将使用透视投影,它利用与上一篇文章中所示的不同内部矩阵。…

No Module named pytorchvideo.losses问题解决

问题描述 最近在跑X3D的源码时发现,在conda powershell prompt中安装了pytorchvideo,但是仍然报错:No Module named pytorchvideo.losses 解决方案: 直接去https://gitcode.com/gh_mirrors/py/pytorchvideo/overview?utm_sour…

24. 正则表达式

一、什么是正则表达式 正则表达式(regular expression)又称 规则表达式,是一种文本模式(pattern)。正则表达式使用一个字符串来描述、匹配具有相同规格的字符串,通常被用来检索、替换那些符合某个模式&…

golang对日期格式化

1.对日期格式化为 YYYY-mm-dd, 并且没有数据时,返回空 import ("encoding/json""time" )type DateTime time.Timetype SysRole struct {RoleId int64 gorm:"type:bigint(20);primary_key;auto_increment;角色ID;" json:&quo…

AI赋能电商:提升销售效率与用户体验的新引擎

在数字化时代,人工智能(AI)技术正逐步渗透到各行各业,其中电商行业尤为显著。AI技术的引入不仅为电商平台带来了前所未有的创新应用,还极大地提升了销售效率和用户体验。本文将探讨AI技术在购物推荐、会员分类、商品定…

int溢出值(c基础)

1. **整数类型** - **字节型(byte)** - **定义**:字节型通常占用1个字节(8位)存储空间。 - **范围**:在有符号的情况下,范围是从 - 128到127(使用补码表示,最小值为$1000…