bash
和 sh
都是 Unix 系统中的命令行解释器,但是它们有一些关键的区别:
-
历史与兼容性:
sh
是 Bourne shell 的简称,最初由 Stephen Bourne 在 1977 年开发。它是 Unix 系统的标准 shell,注重稳定性和兼容性。bash
是 Bourne Again Shell 的简称,是sh
的增强版,具备更多功能。它是 GNU 项目的一部分,并且在许多 Linux 发行版中作为默认 shell。
-
功能差异:
- 内建命令与语法:
bash
支持更多内建命令和语法,比如[[ ]]
测试条件、<()
进程替换、**
通配符等。sh
的功能更为基础和简洁,不支持这些扩展。
- 数组支持:
bash
支持一维数组和相关操作。sh
不支持数组。
- 字符串操作:
bash
提供更多字符串操作和参数扩展功能。sh
中的字符串操作相对有限。
- 内建命令与语法:
-
可移植性:
- 脚本如果需要在不同的 Unix 系统上运行,使用
sh
可能会更具可移植性,因为sh
是标准的 Unix shell。 bash
提供了更多高级功能,但在某些不包含 GNU 工具链的系统上可能不可用。
- 脚本如果需要在不同的 Unix 系统上运行,使用
-
启动与执行:
- 运行脚本时,使用
bash
会启用bash
shell,使用sh
会启用sh
shell。如果系统将sh
作为指向其他 shell(如bash
)的符号链接,那么sh
运行时可能会实际调用bash
,但会以sh
兼容模式运行,禁用某些bash
特性。
- 运行脚本时,使用
示例
假设我们有一个脚本 example.sh
:
#!/bin/sh
echo "This is sh"
if [ "$BASH_VERSION" ]; then
echo "This is actually bash in sh compatibility mode"
fi
使用 sh
运行:
sh example.sh
# 输出:
# This is sh
使用 bash
运行:
bash example.sh
# 输出:
# This is sh
# This is actually bash in sh compatibility mode
在 bash
运行时,会检测到 BASH_VERSION
变量,这个变量只有在 bash
shell 中存在。
修正脚本问题
将文件格式转换为 Unix 格式,确保环境变量正确设置后,使用 bash
运行脚本:
dos2unix start.sh
export CLASH_URL="your_value"
sudo bash start.sh