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环境。