Shell 中exec跟source差在哪?
参考答案:
在Shell中,exec
和 source
都是用于执行脚本或命令的,但它们之间存在一些关键的区别。
-
执行方式:
exec
:它会替换当前Shell进程,并启动指定的命令或脚本。当exec
命令执行后,原始Shell进程结束,由新的进程替换。这意味着exec
后面的任何命令都不会在当前Shell中执行。source
:它会在当前Shell中执行脚本,而不是启动一个新的Shell进程。脚本中的任何变量或函数更改都会反映到当前的Shell环境中。
-
环境变量和函数:
- 使用
exec
执行的脚本中定义的变量或函数在脚本执行完成后不会保留在原始Shell环境中。 - 使用
source
执行的脚本中定义的变量或函数会在脚本执行完成后保留在原始Shell环境中。
- 使用
-
退出状态:
- 如果
exec
后面的命令或脚本执行成功,则原始Shell进程的退出状态为该命令或脚本的退出状态。如果执行失败,则原始Shell进程也会以失败状态退出。 source
命令的退出状态反映了被执行的脚本的退出状态。
- 如果
-
别名和函数:
source
可以识别并扩展别名和函数,而exec
则不能。
-
命令格式:
exec
后面直接跟要执行的命令或脚本。source
后面通常跟脚本的路径,或者使用点号.
作为简写,例如source script.sh
或. script.sh
。
示例:
假设你有一个名为vars.sh
的脚本,内容如下:
#!/bin/bash
VAR1="Hello"
VAR2="World"
如果你在Shell中执行exec ./vars.sh
,脚本会执行,但之后你尝试访问VAR1
或VAR2
时,会发现它们未定义,因为exec
替换了当前Shell进程。
但是,如果你执行source ./vars.sh
或. ./vars.sh
,脚本会在当前Shell中执行,之后你可以访问VAR1
和VAR2
,它们的值分别是"Hello"和"World"。
总的来说,选择使用exec
还是source
取决于你的具体需求和你希望如何影响或保留Shell环境。