跳到主要内容

Shell 中exec跟source差在哪?

参考答案:

在Shell中,execsource 都是用于执行脚本或命令的,但它们之间存在一些关键的区别。

  1. 执行方式

    • exec:它会替换当前Shell进程,并启动指定的命令或脚本。当exec命令执行后,原始Shell进程结束,由新的进程替换。这意味着exec后面的任何命令都不会在当前Shell中执行。
    • source:它会在当前Shell中执行脚本,而不是启动一个新的Shell进程。脚本中的任何变量或函数更改都会反映到当前的Shell环境中。
  2. 环境变量和函数

    • 使用exec执行的脚本中定义的变量或函数在脚本执行完成后不会保留在原始Shell环境中。
    • 使用source执行的脚本中定义的变量或函数会在脚本执行完成后保留在原始Shell环境中。
  3. 退出状态

    • 如果exec后面的命令或脚本执行成功,则原始Shell进程的退出状态为该命令或脚本的退出状态。如果执行失败,则原始Shell进程也会以失败状态退出。
    • source命令的退出状态反映了被执行的脚本的退出状态。
  4. 别名和函数

    • source可以识别并扩展别名和函数,而exec则不能。
  5. 命令格式

    • exec后面直接跟要执行的命令或脚本。
    • source后面通常跟脚本的路径,或者使用点号.作为简写,例如source script.sh. script.sh

示例

假设你有一个名为vars.sh的脚本,内容如下:

#!/bin/bash
VAR1="Hello"
VAR2="World"

如果你在Shell中执行exec ./vars.sh,脚本会执行,但之后你尝试访问VAR1VAR2时,会发现它们未定义,因为exec替换了当前Shell进程。

但是,如果你执行source ./vars.sh. ./vars.sh,脚本会在当前Shell中执行,之后你可以访问VAR1VAR2,它们的值分别是"Hello"和"World"。

总的来说,选择使用exec还是source取决于你的具体需求和你希望如何影响或保留Shell环境。