脚本中使用Sh和Bash的区别

neevop 十二月 14, 2022

bash和sh的关系

bash 和 sh 是 Unix 操作系统的两个不同的 shell。bash 是 sh,但具有更多功能和更好的语法。Bash 是“Bourne Again SHell”,是对 sh(原始 Bourne shell)的改进。Shell 脚本是在任何 shell 中编写脚本,而 Bash 脚本是专门为 Bash 编写的脚本。sh 是 Unix/类 Unix 操作系统的 shell 命令行解释器。sh 提供了一些内置命令。bash 是 sh 的超集。Shell 是运行命令和 shell 脚本的命令行界面。Shell 有多种风格,就像操作系统有多种风格一样。所以,Shell 是用户和操作系统之间的接口,它帮助用户与设备进行交互。

sh 也称为 Bourne Shell。sh 是 POSIX 标准描述的命令编程语言。它适用于 UNIX 或类 UNIX 操作系统。它有很多实现。在大多数操作系统上,sh 由 dash、kash 和原始 Bourne Shell 等程序实现。sh 是 bash 的前身。/bin/sh 是主要实现的实际链接。它是大多数 POSIX 系统中的符号链接。

sh 本身不是一种编程语言。这只是一个规范。sh是对语言语法和语义的详细描述。它不包括实现。sh 是作为早期 UNIX shell 的替代品编写的。它的大部分语法与 ALGOL68 编程语言的语法相同。

如何选择两者

如果我们希望我们的语言与多个系统兼容,我们应该使用 sh。sh 脚本最喜欢在 bash 上运行,也无需修改,因为 bash 向后兼容 sh。sh 是适用于大多数 POSIX/Unix/Linux 系统的最便携的脚本语言。sh 的一个优点是它保证存在于所有声称适用于 Unix 系统的东西上。

bash 也是一种类似于 sh 的命令编程语言。如今,bash 是大多数基于 Linux 的操作系统上的默认登录 shell。它是 sh 系统的扩展版本,用于 GNU 替代 Bourne shell。我们也可以说 bash 是一种编程语言。这里像 python 一样思考,我们可以在交互模式下启动 python,它的行为就像一个 shell,但我们也可以在任何 IDE 上运行 python 程序。

bash 是 sh 的超集。这意味着 bash 支持 sh 的特性并提供比 sh 更多的功能。尽管大多数命令与 sh 做同样的事情。bash 不是 POSIX 兼容的 shell。它是 POSIX shell 语言的一种方言。Bash 可以在文本窗口中运行,并允许用户解释命令以执行各种任务。它具有 Korn 和 C shell 最好和最有用的特性,例如目录操作、作业控制、别名等等。

如同 GNU 软件 bash 提供了其他 shell,包括 csh 的一个版本,Bash 是默认的 shell。bash 旨在成为 IEEE POSIX 规范(IEEE 标准 1003.1)的 IEEE POSIX Shell 和工具部分的一致实现。与其他 GNU 一样,bash 也很便携。这适用于任何在预期位置具有 bash 的基于 Linux/Unix 的系统。bash 在编程和交互使用方面比 sh 功能更强大,因此我们推荐尽可能使用bash进行shell脚本的编写。

sh:

#!/bin/sh

bash:

#!/bin/bash

常见的问题

  1. 如果你习惯于使用bash编写shell脚本,当你的脚本在jenkins中运行时可能会报出某些命令找不到的错误。例如:

    .../script.sh: [[: not found
    

    由于jenkins默认采用的是sh而不是bash,导致这里无法识别bash指令。幸运的是,Jenkins 有一个设置 shell 可执行文件路径的选项。需要转到Manage Jenkins > Configure System > Shell > Shell executable并设置您的 shell 路径(即/bin/bash)。

扩展阅读

  1. bash官方功能对比文档
  2. 大神关于两者差异的叙述
  3. bash速查手册