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用法是启动新程序或脚本时:exec ls这会用 `ls` 命令替换当前Shell进程,因此,`ls` 执行后Shell进程就结束了,脚本中其他命令不会继续执行。
- 特点:
- 不会创建新进程,直接替换当前进程。
- 适用于想要在当前Shell环境中执行命令并结束当前Shell进程的情况。
source详解:
source用于在当前Shell环境中执行脚本或命令。与exec不同,source执行的脚本不会替换当前Shell进程,而是将脚本内容直接执行在当前Shell进程中,脚本中定义的变量、函数等会保留在当前环境中。常见用法是加载配置文件:source ~/.bashrc或者简写为:
. ~/.bashrc这样做会让你在当前Shell中加载配置文件的内容,并使得变量和函数在当前Shell环境中生效。
- 特点:
- 在当前Shell进程中执行脚本,脚本中的变量、函数等会影响当前Shell环境。
- 可以加载配置文件或执行局部脚本,不会改变当前进程。
典型应用场景:
- 使用
exec:- 用于脚本最后调用程序,并希望结束当前Shell进程:
exec ./my_program - 用于将一个Shell脚本替换成另一个Shell脚本:
exec bash script.sh
- 用于脚本最后调用程序,并希望结束当前Shell进程:
- 使用
source:- 加载配置文件或环境变量到当前Shell:
source ~/.bash_profile - 运行一个脚本以修改当前环境设置,例如设置新的环境变量或加载函数:
source /path/to/script.sh
- 加载配置文件或环境变量到当前Shell:
总结
exec 和 source 的主要区别在于:
– exec 会替换当前Shell进程,脚本后续的命令将不再执行。
– source 在当前Shell进程中执行脚本,并且执行结果会影响当前环境。
理解这两者的区别有助于更好地控制脚本的执行流程和Shell环境。