在Linux中,sh和bash都是Shell解释器,但存在关键区别。以下是详细对比:
sh的增强版,为GNU项目的一部分,兼容sh并扩展了大量功能。| 特性 | sh | bash(扩展功能) |
|---|---|---|
| 命令历史 | ❌ 不支持 | ✅ history, !!, !$ |
| 命令行编辑 | ❌ 基础功能 | ✅ 支持快捷键(如Ctrl+A/E) |
| 数组 | ❌ 不支持 | ✅ 支持 |
| 算术运算 | ❌ 仅expr |
✅ $(( )) 和 let |
| 通配符扩展 | ❌ 基础 | ✅ 扩展模式(如{1..10}) |
| 别名(alias) | ❌ 有限支持 | ✅ 支持复杂别名 |
| 进程替换 | ❌ 不支持 | ✅ <() 和 >() |
| 调试功能 | ❌ 无 | ✅ set -x, trap等 |
sh模式运行时(通过#!/bin/sh或bash --posix),会关闭部分扩展功能以保持兼容。/bin/sh通常是符号链接,可能指向bash、dash(Debian默认)或其他轻量Shell。dash)更轻量,启动速度快,适合脚本只需基础功能的场景(如系统启动脚本)。sh的场景
/etc/init.d/*)。bash的场景
# 查看实际运行的Shell
echo $SHELL # 用户默认Shell
echo $0 # 当前会话的Shell
# 检查/bin/sh的指向
ls -l /bin/sh # 例如可能指向dash或bash
sh脚本(最大兼容性):sh
#!/bin/shbash脚本(需扩展功能时):bash
#!/bin/bashsh是标准,bash是扩展。sh语法;若需高级功能,明确使用bash。/bin/sh链接到dash)可能因Shell差异报错,需测试验证。通过理解这些差异,可以更高效地选择适合的Shell环境。