Shell 中exec跟source差在哪?
参考回答
exec
和 source
都是Shell中常用的命令,但它们的作用和行为有所不同:
exec
:exec
用于替换当前Shell进程的执行程序,不会创建新的进程。例如,执行exec command
时,当前Shell进程会被command
替代,脚本执行会直接跳到command
,执行完后Shell进程也就结束了。- 使用
exec
后,脚本剩下的命令将不会被执行。
source
:source
(或其缩写.
)用于在当前Shell进程中执行脚本文件。与exec
不同,source
不会替换当前Shell进程,而是在当前Shell环境中执行脚本内容。因此,脚本中的变量、函数等会影响当前Shell环境。- 使用
source
后,脚本执行完仍会返回到当前Shell继续执行。
详细讲解与拓展
exec
详解:
exec
会将当前Shell进程替换为指定的命令,因此,脚本中exec
后的命令会完全替代当前的Shell进程。换句话说,当执行exec
后,Shell脚本中后续的命令将不会再被执行。常见的exec
用法是启动新程序或脚本时:这会用 `ls` 命令替换当前Shell进程,因此,`ls` 执行后Shell进程就结束了,脚本中其他命令不会继续执行。
- 特点:
- 不会创建新进程,直接替换当前进程。
- 适用于想要在当前Shell环境中执行命令并结束当前Shell进程的情况。
source
详解:
source
用于在当前Shell环境中执行脚本或命令。与exec
不同,source
执行的脚本不会替换当前Shell进程,而是将脚本内容直接执行在当前Shell进程中,脚本中定义的变量、函数等会保留在当前环境中。常见用法是加载配置文件:或者简写为:
这样做会让你在当前Shell中加载配置文件的内容,并使得变量和函数在当前Shell环境中生效。
- 特点:
- 在当前Shell进程中执行脚本,脚本中的变量、函数等会影响当前Shell环境。
- 可以加载配置文件或执行局部脚本,不会改变当前进程。
典型应用场景:
- 使用
exec
:- 用于脚本最后调用程序,并希望结束当前Shell进程:
- 用于将一个Shell脚本替换成另一个Shell脚本:
- 使用
source
:- 加载配置文件或环境变量到当前Shell:
- 运行一个脚本以修改当前环境设置,例如设置新的环境变量或加载函数:
总结
exec
和 source
的主要区别在于:
– exec
会替换当前Shell进程,脚本后续的命令将不再执行。
– source
在当前Shell进程中执行脚本,并且执行结果会影响当前环境。
理解这两者的区别有助于更好地控制脚本的执行流程和Shell环境。