sh vs bash 傻傻分不清楚

258 阅读2分钟

Shell是后台研发、DevOps必须掌握的技能之一,而sh和bash又是最常用的两种Shell,但是你真的了解它们吗?这些脚本是让你事半功倍,还是让你头疼不已🙄?

请思考以下代码,是否似曾相识的感觉? 在这里插入图片描述 你发现什么问题,导致的原因是什么?

Shell

命令行语言解释器,接收用户输入的命令行,交给操作系统执行,并将执行结果反馈给用户,提供用户和操作系统交互的接口。

Shell标准化

在Shell伴随Unix发展过程中,各种变种、分支发展可谓百花齐放(如下图),带来丰富功能的同时,也带来了跨平台、兼容性等问题。为解决这些问题IEEE在POSIX规范中对Shell进行了标准化。 在这里插入图片描述

什么是 sh ?

#!/bin/sh
  • 在POSIX对Shell进行标准化前,sh主要是指Unix系统的(Bourne Shell)。在标准化后,我们可以认为sh是Shell的规范标准,而其具体实现由dash、csh、ksh来完成,bash也可以被视为sh的一种实现(对比python与 CPython、JPython)。

  • 由于sh是一个规范而不是实现,大多数POSIX系统上的/bin/sh是一个符号链接(或硬链接),指向实际的实现版本(如下图所示)。 在这里插入图片描述

什么是 bash ?

#!/bin/bash
  • Bash(GNU的Bourne-Again SHell)是一个完整实现IEEE POSIX和Open Group Shell规范的命令行解释器,具有交互式命令行编辑、支持作业控制(在支持的架构上)、类似csh的功能,如历史替换和花括号展开,以及其他一系列功能。

  • bash是sh的超集,但并不是一个符合POSIX标准的Shell,它是POSIX Shell语言的一个方言

回到开始

继续下面的代码,就知道根本原因了。问题出在 [[ expr ]] ,这个表达式不是标准的,而是bash针对 [ expr ] 进行的增强版本,所以左边的代码正常执行,而右边的代码则报错,并给出了错误结果。

在这里插入图片描述

我该用sh?还是应该用bash?

  • sh:可移植性强,一次编写,到处运行。
  • bash:使用简单,功能更强大。

脱离业务的讨论属于耍流氓,我们要将业务场景和技术选型相结合。90%的业务需求,对于bash来说都是轻松+愉快,至于剩下的10%嘛,人生苦短,我用python 😏。