bash
和 sh
是 Unix/Linux 系统中常见的两种 Shell,它们虽然有很多相似之处,但也存在一些关键的区别。
1. 定义与历史
sh
:- 是 Bourne Shell 的简称,由 Stephen Bourne 在 1979 年开发。
- 是 Unix 系统中第一个广泛使用的 Shell,符合 POSIX 标准。
- 提供基础的脚本编写和命令解释功能,语法简单。
bash
:- 是 Bourne Again Shell 的简称,由 GNU 项目开发,是 Bourne Shell 的增强版。
- 向后兼容
sh
,并在其基础上增加了许多新功能(如命令补全、历史管理、数组支持等)。 - 通常是 Linux 系统的默认 Shell。
2. 功能对比
功能特性 | sh | bash |
---|---|---|
兼容性 | 基于 POSIX 标准,功能较基础,便于移植。 | 兼容 POSIX 标准,同时支持丰富的扩展功能。 |
交互特性 | 功能有限,如无命令补全等特性。 | 支持命令补全、历史搜索、快捷键操作等。 |
数组支持 | 不支持数组。 | 支持一维数组。 |
脚本调试 | 提供基本的调试功能(如 set -x )。 | 提供更多调试功能(如 PS4 自定义调试信息)。 |
变量与字符串 | 仅支持基础变量操作。 | 支持更多高级操作(如字符串替换、数组操作)。 |
命令别名 | 不支持命令别名。 | 支持命令别名(alias 命令)。 |
扩展功能 | 无扩展功能。 | 提供额外的扩展功能(如 [[ ]] 条件测试、<<< here-string)。 |
3. 性能
sh
:- 因为功能较少,通常启动和运行速度更快。
- 常用于写轻量级的脚本。
bash
:- 功能丰富,因此资源占用稍高。
- 更适合写复杂的脚本或交互式使用。
4. 兼容性
sh
是 POSIX 标准的实现,因此更具有可移植性,适合在各种 Unix 系统上运行。bash
包括了sh
的所有功能,但有一些扩展功能在非 GNU 系统(如 Solaris 或 macOS)上可能无法运行。
5. 实际使用
- 默认 Shell:
- 在许多 Linux 系统中,
/bin/sh
是/bin/bash
的符号链接,但在某些轻量级发行版中(如 Ubuntu),/bin/sh
是dash
,一个更简化的 Shell。
- 在许多 Linux 系统中,
- 脚本编写:
- 如果需要兼容性高的脚本,使用
sh
。 - 如果需要更丰富的功能,使用
bash
。
- 如果需要兼容性高的脚本,使用
示例对比
数组支持
# bash 支持数组
#!/bin/bash
arr=(1 2 3)
echo ${arr[0]} # 输出 1
# sh 不支持数组
#!/bin/sh
arr=(1 2 3) # 会报错
字符串操作
# bash 支持高级字符串操作
#!/bin/bash
str="hello world"
echo ${str/world/universe} # 输出 hello universe
# sh 不支持字符串替换
#!/bin/sh
str="hello world"
echo ${str/world/universe} # 会报错
总结
- 使用
sh
:当需要编写兼容性高、轻量的脚本,特别是在各种 Unix 环境中运行时。 - 使用
bash
:当需要丰富的功能和语法支持时,特别是在 Linux 环境中。