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标准描述的一种编程语言,有多种实现,如ksh88
、Dash
等。在大多数POSIX系统中,/bin/sh
是指向实际实现的符号链接或硬链接。
了解 Bash
Bash最初是一个与sh
兼容的实现,随着时间的推移,它获得了许多扩展。Bash支持--posix
开关,使其更符合POSIX标准。如果以sh
的名称调用,它也会尝试模仿POSIX行为。
确定 /bin/sh
的指向
- 符号链接:使用
file -h /bin/sh
命令来解析符号链接。
1 |
|
- 硬链接:使用
find -L /bin -samefile /bin/sh
命令来查找硬链接。
1 |
|
选择使用的 shell
通过在脚本的第一行编写shebang
行来决定使用哪个shell。
1 |
|
上述代码将使用sh
。
1 |
|
上述代码将使用/bin/bash
(如果可用)。
核心代码
使用sh
执行脚本
1 |
|
使用bash
执行脚本
1 |
|
最佳实践
- 如果需要编写跨POSIX系统的可移植脚本,建议使用
sh
,因为它是标准化的,更简单易学,并且所有POSIX系统都必须支持。 - 如果需要使用更多的高级功能,如数组、局部变量等,可以使用
bash
。
常见问题
sh
和 bash
的行为不同
sh
是POSIX标准的实现,而bash
有许多扩展。一些常见的差异包括:
[[
在sh
中不可用,只能使用[
。sh
不支持数组。- 一些Bash关键字,如
local
、source
等,在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/