深入理解 `sh` 和 `source`:执行脚本时的关键区别
2024-03-02 17:25:08
sh
和 source
:执行脚本时的关键区别
作为一名程序员或技术作家,在日常运维、开发或学习中,您肯定会遇到 sh
和 source
命令。虽然两者都用于加载和执行外部文件中的命令,但它们在执行方式、环境变量处理和返回值等方面存在一些关键区别。
执行方式
sh
命令 以子 shell 的方式执行脚本或命令。这意味着它会创建一个新的进程来运行脚本,与当前 shell 分离。
source
命令 则是在当前 shell 中直接执行脚本或命令。它不会创建新的进程,而是在当前 shell 的环境中执行。
环境变量
sh
命令 在执行脚本时,会创建一个新的环境变量空间。脚本中定义的环境变量不会影响当前 shell 的环境。
source
命令 在执行脚本时,会在当前 shell 的环境变量空间中执行。脚本中定义的环境变量也会反映在当前 shell 中。
返回值
sh
命令 在执行脚本后,会返回脚本的退出状态码。
source
命令 不会返回任何退出状态码。
用途场景
sh
命令 通常用于执行一次性脚本或命令,不会影响当前 shell 的环境或变量。例如,您可以使用 sh
命令运行一个简单的脚本来查看当前目录下的文件列表:
sh ls -l
source
命令 通常用于加载公共函数库、设置环境变量或执行需要修改当前 shell 环境的脚本。例如,您可以使用 source
命令加载一个函数库,然后在当前 shell 中使用其中定义的函数:
source my_functions.sh
echo $(my_function "Hello world!")
示例
以下示例展示了 sh
和 source
命令在执行脚本时环境变量的变化:
# 创建一个脚本文件 named.sh,内容为:
export NAME="John Doe"
# 使用 sh 执行脚本
sh named.sh
# 查看当前 shell 的 NAME 环境变量
echo $NAME # 输出为空
# 使用 source 执行脚本
source named.sh
# 再次查看当前 shell 的 NAME 环境变量
echo $NAME # 输出为 "John Doe"
在第一个示例中,使用 sh
命令执行脚本时,脚本中定义的环境变量 NAME
不会影响当前 shell 的环境。而在第二个示例中,使用 source
命令执行脚本后,NAME
环境变量被添加到当前 shell 的环境中。
结论
sh
和 source
命令是执行脚本或命令的两种不同的方法,各有其用途。sh
命令 以子 shell 的方式执行脚本,不会影响当前 shell 的环境或变量。source
命令 在当前 shell 中直接执行脚本,脚本中定义的环境变量也会反映在当前 shell 中。在需要一次性执行脚本或命令时使用 sh
命令,在需要修改当前 shell 环境或加载公共函数库时使用 source
命令。
常见问题解答
1. sh
和 /bin/sh
有什么区别?
/bin/sh
是 sh
命令的默认 shell,通常是 Bash。因此,在大多数情况下,sh
和 /bin/sh
是可以互换的。
2. 什么时候应该使用 .
而不是 source
?
.
和 source
是同义词,都可以用于加载和执行脚本。但是,source
通常更推荐使用,因为它更清晰,也更符合 POSIX 标准。
3. source
命令可以执行任意命令吗?
是的,source
命令可以执行任何命令,不仅仅是脚本。例如,您可以使用 source
命令来设置环境变量或运行管道命令。
4. 如何从脚本中调用其他脚本?
您可以使用 sh
或 source
命令从脚本中调用其他脚本。例如:
#!/bin/bash
# 使用 sh 调用另一个脚本
sh ./other_script.sh
# 使用 source 调用另一个脚本
source ./other_script.sh
5. 如何在 source
的脚本中使用函数?
在 source
的脚本中,可以通过将函数定义放在脚本文件的最前面来使用函数。例如:
#!/bin/bash
function my_function() {
echo "Hello world!"
}
# 在脚本的其他地方调用函数
my_function
希望这篇文章能帮助您深入理解 sh
和 source
命令之间的差异,以及如何在您的日常工作中有效使用它们。