Linux系统的source命令详解(普通形式执行脚本与source方式执行脚本的区别)

source命令概要介绍

source 命令是 Unix 和 Linux 系统中的一个内建命令,用于在当前 shell 会话中执行指定的脚本或文件。与直接执行脚本文件不同,source 命令不会启动一个新的子 shell,而是将脚本文件中的命令直接在当前 shell 环境中执行。这使得 source 命令特别适用于修改当前 shell 环境变量的场景。

语法:

source <file>

或者,简写为:

. <file>

其中 <file> 是你要执行的脚本或文件的路径。

普通形式执行脚本与source方式执行脚本的区别

source(或者 .)命令用于 在当前的 Shell 会话中执行一个脚本,而 不会创建子 Shell。这意味着脚本对环境的更改(如设置环境变量、修改当前目录等)会直接影响到 当前的终端会话

这与普通执行脚本(例如 ./myscript.sh)的行为有一个关键区别——普通执行脚本会在一个新的子 Shell 中运行,脚本对环境的任何更改都不会影响到当前 Shell。具体来说:

  1. 普通脚本执行:如果你运行一个脚本(如 ./myscript.sh),脚本会在一个新的子 Shell 环境中执行。它对当前 Shell 环境的任何更改(例如修改环境变量)都会在脚本执行结束后丢失,因为子 Shell 会话会结束。

  2. 使用 source 命令执行脚本:如果你用 source myscript.sh 来执行脚本,脚本中的任何环境变量设置、路径更改等都会 直接修改当前 Shell 的环境,并且这些更改会在脚本执行后继续保留在当前的 Shell 会话中。

举例说明:

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

# set_env.sh
export MY_VAR="Hello, world!"
cd /home/user

如果直接执行脚本:

./set_env.sh
  • 脚本会在 子 Shell 中执行。
  • 脚本中对环境变量 MY_VAR 和当前目录的更改只会作用在 子 Shell 中,脚本执行完后,你的当前 Shell 会话中的环境变量和目录都不会受到影响。

如果使用 source 执行脚本:

source set_env.sh
  • 脚本会在 当前 Shell 中执行。
  • 脚本中的环境变量 MY_VAR 会被设置到当前 Shell 中,当前 Shell 的目录会改变为 /home/user,并且这些更改会一直保留在当前终端会话中,直到你关闭终端或者手动修改它们。

source命令常见作用

  1. 加载环境变量
    通过执行一个脚本来设置或修改当前 shell 环境中的变量。比如,在启动终端时,我们通常需要加载一些环境配置脚本,例如修改 PATH 环境变量、设置代理、启用开发工具等。

    示例:

    source ~/.bashrc
    

    这个命令会重新加载当前用户的 .bashrc 文件,从而使得新的环境变量或配置生效。
    这条命令我在博文 https://blog.youkuaiyun.com/wenhao_ir/article/details/144326545中已经用过了。

  2. 设置构建环境
    在使用 Yocto 或其他开发工具时,source 命令经常用来加载配置文件,从而设置相关的环境变量。例如,Yocto 中使用 source oe-init-build-env 来设置构建环境,或在 imx-setup-release.sh 中使用 source setup-environment 来加载构建环境配置。

  3. 执行脚本中的命令
    如果你有一个脚本文件(例如,setup-environment)来配置你的开发环境,使用 source 命令可以确保脚本中的命令在当前 shell 中执行,而不是启动一个新的 shell。这样,脚本对环境的修改(如设置环境变量)会立即在当前 shell 会话中生效。

    示例:

    source /root/imx-yocto-bsp/setup-environment /root/imx-yocto-bsp/build-imx-fb
    

    这条命令的详细解释见本博文后面。

作用总结:
source 命令非常有用,特别是当你需要在当前 shell 环境中执行一些脚本,修改环境变量,或者激活某些设置时。它允许你在不启动新 shell 的情况下执行脚本,因此,脚本中的修改会立即对当前会话生效。

实例详解

这个实例来源于博文:https://blog.youkuaiyun.com/wenhao_ir/article/details/145547974

source /root/imx-yocto-bsp/setup-environment /root/imx-yocto-bsp/build-imx-fb

使用 source 命令来加载一个环境设置脚本 setup-environment,并为构建目录 build-imx-fb 配置必要的环境变量。

命令详解:

  1. source 命令

    • source(也可以写作 .)是一个内建命令,主要用于在当前 shell 环境中执行脚本文件中的命令,而不是启动一个新的子 shell。它会使得脚本中的命令(比如设置环境变量、修改路径等)在当前 shell 会话中生效。
  2. /root/imx-yocto-bsp/setup-environment

    • 这是一个用于设置 Yocto 构建环境的脚本文件,位于 /root/imx-yocto-bsp/ 目录下。这个脚本会为 Yocto 构建系统设置一些必要的环境变量、路径等。
    • 当你执行 source /root/imx-yocto-bsp/setup-environment 时,它会确保当前 shell 环境具备 Yocto 构建所需的配置,包括 bitbake 的路径、目标机器的设置、构建工具的配置等。
  3. /root/imx-yocto-bsp/build-imx-fb

    • 这是你指定的 Yocto 构建目录(build-imx-fb)。通过传递这个目录路径给 setup-environment 脚本,它会设置与该构建目录相关的环境变量。这包括:
      • 配置构建目录。
      • 设定正确的机器(machine)和发行版本(distro)等。
      • 初始化本次构建的相关设置,确保后续的构建操作使用的是正确的配置。
<think>好的,我现在要回答用户关于Linux中exec命令执行脚本直接运行脚本区别的问题。首先,我需要回忆一下自己之前学过的相关知识,并结合用户提供的引用内容来整理答案。 用户提到了三个引用,分别解释了exec命令在shell脚本中的行为,exec、source、sh执行脚本区别,以及exec作为bash内部命令的特点。根据这些信息,我需要先理清每个执行方式的工作原理,然后比较它们的区别。 首先,直接运行脚本,比如使用./script.sh或者bash script.sh,通常会在当前shell的一个子进程中执行。子进程会继承父进程的环境变量,但子进程中的变量变化不会影响父进程。这是常见的执行方式,适用于需要保持当前shell环境不被修改的情况。 接下来是使用exec命令执行脚本,如exec ./script.sh。根据引用[2],exec会替换当前shell进程,而不是创建新的子进程。这意味着脚本执行完毕后,原来的shell进程会被终止,控制权不会返回到原来的shell。这点和直接执行有很大不同,直接执行结束后会回到父shell,而exec执行后则不会。比如,如果用户在终端中执行exec script.sh,脚本运行结束后终端会话可能会结束,因为原来的shell被替换了。 然后是使用source命令或者.执行脚本,这种方式会在当前shell环境中执行脚本中的命令,所有变量的更改都会影响当前shell。比如,source script.sh后,脚本中设置的变量在终端中仍然有效。不过source和exec的区别在于,source执行完后会继续执行后续命令,而exec会替换当前shell,后续命令不会执行。 另外,引用[1]提到,为了避免exec替换当前shell的影响,通常会把exec放在子脚本中,由主脚本调用,这样主脚本通过子shell执行exec命令,替换的是子shell而不是主脚本的shell。这进一步说明了exec的行为取决于它所在的执行环境。 现在需要将这些信息结构化,明确不同执行方式区别,包括进程创建、环境继承、执行后的控制流等方面。同时,需要结合用户提供的引用内容,确保回答准确且有依据。 可能还需要考虑权限问题,比如exec执行是否需要可执行权限,或者是否依赖于解释器。但根据常规情况,exec执行脚本直接执行一样,需要脚本执行权限,并且正确的shebang行。 最后,生成相关问题,需要围绕exec的不同使用场景、其他执行方式的对比,以及实际应用中的注意事项来提问,帮助用户进一步理解。</think>在Linux系统中,`exec`命令执行脚本直接运行脚本的核心区别在于**进程替换机制**和**执行上下文的影响**。以下是具体对比分析: --- ### 一、直接运行脚本方式 1. **执行方式** 使用`./script.sh`或`bash script.sh`时,系统会**创建新的子进程**来执行脚本。 ```bash # 示例:启动子进程执行脚本 bash script.sh ``` 2. **进程关系** - 子进程继承父进程的环境变量,但**子进程的变量修改不会影响父进程**。 - 脚本执行完毕后,控制权**返回父进程**(如终端或主脚本)[^2]。 3. **典型场景** 需保持当前Shell环境独立,避免脚本操作污染当前会话。 --- ### 二、使用`exec`命令执行脚本 1. **执行方式** 通过`exec script.sh`调用时,**直接替换当前Shell进程**,不创建子进程。 ```bash # 示例:替换当前进程执行脚本 exec ./script.sh ``` 2. **进程关系** - **原Shell进程被脚本进程完全替代**,PID保持不变。 - 脚本结束后**不会返回原Shell**,若在终端中执行,终端会话将直接关闭[^1][^2]。 3. **典型场景** - 脚本作为进程的最终操作(如容器启动脚本)。 - 需要减少进程层级,优化资源占用。 --- ### 三、关键区别总结 | 特性 | 直接运行脚本 | `exec`执行脚本 | |---------------------|---------------------|-----------------------| | 进程创建 | 新建子进程 | **替换当前进程** | | 环境变量影响 | 子进程独立 | 继承并替换当前环境 | | 执行后控制权 | 返回父进程 | **不返回**,进程结束 | | 资源占用 | 多进程消耗资源 | 单进程,资源占用少 | --- ### 四、补充对比:`source``exec` - `source script.sh` 在当前Shell中逐行执行脚本,**保留环境变量修改**,且执行后继续运行后续命令[^3]。 - `exec script.sh` 替换当前Shell进程,**丢弃后续命令**,环境变量修改随进程结束消失。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昊虹AI笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值