在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/sh
bash
脚本(需扩展功能时):bash
#!/bin/bash
sh
是标准,bash
是扩展。sh
语法;若需高级功能,明确使用bash
。/bin/sh
链接到dash
)可能因Shell差异报错,需测试验证。通过理解这些差异,可以更高效地选择适合的Shell环境。