文章目录
- 引言
- bash和sh的区别
- CentOS下的区别
- Ubuntu下的区别
- 最佳实践
引言
我们在编写shell脚本时,通常第一行都要声明当前脚本的执行程序,也就是常见的 #!/bin/sh
或者是 #!/bin/bash
,我们无论用哪一个脚本似乎都可以正常的执行,那具体有什么区别呢,我们接下来会详细的讲一下。
bash和sh的区别
在大多数的Linux系统里, #!/bin/sh
是 #!/bin/bash
其实就是完全相同的,但是在另外一些Linux系统中两者还是存在不小的区别,这主要是因为Linux系统发展的历史原因导致的,因为Linux操作系统在最近几十年的发展中,逐步分化为不同的发行版,在Redhat和CentOS里两者是相同的,但是在Ubuntu和Debian系统中两者有区别。
CentOS下的区别
首先我们一起看一下CentOS中两者区别,如下图:
可以看到 /bin/sh
是一个软连接(可以简单的理解为window里的快捷方式)指向了/bin/bash
所以两者本身就是同一个shell,没有任何区别
Ubuntu下的区别
我们在一起看看Ubuntu中两者的区别,如下图:
可以看到 /bin/sh
通过软连接指向了dash
这是Ubuntu提供的一个轻量级的shell,他比bash shell
要少一些特性,所以在Ubuntu的系统中,如果我们使用#!/bin/sh
来解释执行我们的脚本,可能就会出现一个诡异的问题。
我举个例子,有如下脚本:
脚本的内容很简单就是声明一个数组,然后遍历打印,注意我们此时用的是 #!/bin/sh
,我们执行一下看看结果,报错了如下图:
报错的原因是语法错误,这是因为在dash shell
中不允许我们直接定义数组。
但是如果我们换为bash shell
来解释执行脚本,我们可以看一下效果,脚本内容如下:
脚本可以正常执行,如下图:
最佳实践
先说结论,shell脚本中建议使用 #!/bin/bash
。
上面讲了两种shell
的区别,我们可以发现使用bash shell
其实可以避免一些诡异的问题,并且bash shell
也是所有linux发行版中都带有的shell
,因此在我们的shell脚本中为了保证脚本在各个linux平台上都可以稳定运行,建议使用 #!/bin/bash
。