Shell编程:/bin/bash和/bin/sh的区别

前言

早期,学过shell的5种启动方式,学的没有那么深入。从而导致了想深究一下docker exec 命令为什么tomcat容器用/bin/bash,nginx容器却用/bin/sh,被这个问题,折腾了半天!

从/bin/bash,就是进入不了nginx容器,由此引发了一系列的排查。如果你对,docker的这个错误感兴趣,点击进入

正题

简单的讲,/bin/sh是早期版本,是一种便携方式的解释性脚本语言自带有posix便携式功能,以该方式声明的脚本,脚本中间发生错误会终止脚本的运行,不再运行下面的代码

简而言之:POSIX规范:“当某行代码出错时,不继续往下解释”。bash 就算出错,也会继续向下执行。

/bin/bash,是/bin/sh的升级版,默认没有开启posix便携模式,所以以/bin/bash声明的脚本,中间即使发生错误,依然会继续向下运行

也就是说:shell脚本,第一行写成 #!/bin/bash --posix,脚本执行效果跟#!/bin/sh是一样的。

可以简单的认为:

/bin/sh ==等价于== /bin/bash  --posix  #开启便携模式,遇到错误时,停止继续运行

注意事项(重要):

假设你编写了一个shell脚本,如下: 

#!/bin/bash
echo hello

正常情况下,我们执行这个脚本,会写作 ./test.sh,然后回车,但是很不幸,你不是很了解shell脚本的5种运行方式的差异,随手使用的运行方式是 sh test.sh,那么

即使在test.sh脚本中指定了#!/bin/bash,但仍然是使用/bin/sh执行test.sh,中间发生错误,依然会终止运行。

注意

你日常所使用的/bin/sh可能是个假shell(它是bash的软链接),它的真身很可能是/bin/bash,也就是说,如果你使用了/bin/sh它的本质是#!/bin/bash  --posix。

何以得知?通过man shman bash就看出来了,他们展示的内容几乎是一模一样。

 

也就是说,在新版本的Linux内核中,老的sh已经被后来者bash整合了。

  • 21
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值