插件窝 干货文章 Linux SHELL中sh和bash的区别是什么

Linux SHELL中sh和bash的区别是什么

脚本 功能 bash Shell 966    来源:    2025-04-21

在Linux中,shbash都是Shell解释器,但存在关键区别。以下是详细对比:


1. 历史背景

  • sh(Bourne Shell)
    1977年由Stephen Bourne开发,是Unix的原始Shell,以简洁和高效著称。
  • bash(Bourne-Again Shell)
    1989年由Brian Fox开发,是sh的增强版,为GNU项目的一部分,兼容sh并扩展了大量功能。

2. 功能差异

特性 sh bash(扩展功能)
命令历史 ❌ 不支持 history, !!, !$
命令行编辑 ❌ 基础功能 ✅ 支持快捷键(如Ctrl+A/E)
数组 ❌ 不支持 ✅ 支持
算术运算 ❌ 仅expr $(( ))let
通配符扩展 ❌ 基础 ✅ 扩展模式(如{1..10}
别名(alias) ❌ 有限支持 ✅ 支持复杂别名
进程替换 ❌ 不支持 <()>()
调试功能 ❌ 无 set -x, trap

3. 兼容性

  • bashsh模式运行时(通过#!/bin/shbash --posix),会关闭部分扩展功能以保持兼容。
  • 现代系统中,/bin/sh通常是符号链接,可能指向bashdash(Debian默认)或其他轻量Shell。

4. 性能

  • sh(如dash)更轻量,启动速度快,适合脚本只需基础功能的场景(如系统启动脚本)。
  • bash 功能丰富但稍重,适合交互式使用或复杂脚本。

5. 使用场景建议

  • sh的场景
    • 需要跨Unix系统兼容的脚本。
    • 系统初始化脚本(如/etc/init.d/*)。
  • bash的场景
    • 交互式命令行操作(如Tab补全、历史命令)。
    • 需要数组、字符串操作等高级功能的脚本。

6. 如何检查当前Shell

# 查看实际运行的Shell
echo $SHELL      # 用户默认Shell
echo $0          # 当前会话的Shell

# 检查/bin/sh的指向
ls -l /bin/sh    # 例如可能指向dash或bash

7. 脚本声明建议

  • sh脚本(最大兼容性):
    sh #!/bin/sh
  • bash脚本(需扩展功能时):
    bash #!/bin/bash

总结

  • sh是标准,bash是扩展
  • 脚本若需跨平台,优先用sh语法;若需高级功能,明确使用bash
  • 系统脚本(如Debian的/bin/sh链接到dash)可能因Shell差异报错,需测试验证。

通过理解这些差异,可以更高效地选择适合的Shell环境。