Difference between sh and Bash

Difference between sh and Bash

技术背景

在Unix和Unix-like操作系统中,shell是用户与操作系统之间的接口,它既是命令解释器,也是一种编程语言。sh(Bourne shell)是最早为Unix计算机开发的shell,由Stephen Bourne在1977年于AT&T的贝尔实验室开发。Bash(Bourne Again Shell)是sh的替代品,是大多数Linux发行版中的默认shell。

实现步骤

了解 sh

sh是由POSIX标准描述的一种编程语言,有多种实现,如ksh88Dash等。在大多数POSIX系统中,/bin/sh是指向实际实现的符号链接或硬链接。

了解 Bash

Bash最初是一个与sh兼容的实现,随着时间的推移,它获得了许多扩展。Bash支持--posix开关,使其更符合POSIX标准。如果以sh的名称调用,它也会尝试模仿POSIX行为。

确定 /bin/sh 的指向

  • 符号链接:使用file -h /bin/sh命令来解析符号链接。
1
2
% file -h /bin/sh
/bin/sh: symbolic link to bash
  • 硬链接:使用find -L /bin -samefile /bin/sh命令来查找硬链接。
1
2
3
% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash

选择使用的 shell

通过在脚本的第一行编写shebang行来决定使用哪个shell。

1
#!/bin/sh

上述代码将使用sh

1
#!/bin/bash

上述代码将使用/bin/bash(如果可用)。

核心代码

使用sh执行脚本

1
2
#!/bin/sh
echo "This is a sh script."

使用bash执行脚本

1
2
3
4
5
6
#!/bin/bash
arr=(1 2 3)
for i in "${arr[@]}"
do
echo $i
done

最佳实践

  • 如果需要编写跨POSIX系统的可移植脚本,建议使用sh,因为它是标准化的,更简单易学,并且所有POSIX系统都必须支持。
  • 如果需要使用更多的高级功能,如数组、局部变量等,可以使用bash

常见问题

shbash 的行为不同

sh是POSIX标准的实现,而bash有许多扩展。一些常见的差异包括:

  • [[sh中不可用,只能使用[
  • sh不支持数组。
  • 一些Bash关键字,如localsource等,在sh中不可移植。

错误使用shebang和执行方式

如果脚本的shebang行是#!/bin/bash,但使用sh scriptname来运行脚本,会禁用任何Bash特定的功能,导致语法错误。

检查脚本的POSIX合规性

如果需要检查脚本是否严格符合POSIX标准,可以尝试使用posh的指定POSIX模式。


Difference between sh and Bash
https://119291.xyz/posts/difference-between-sh-and-bash/
作者
ww
发布于
2025年5月26日
许可协议