Shell编程之/bin/bash和/bin/sh的区别浅析
作者:血煞长虹
前言
早期,学过shell的5种启动方式,学的没有那么深入。从而导致了想深究一下docker exec 命令为什么tomcat容器用/bin/bash,nginx容器却用/bin/sh,被这个问题,折腾了半天!
从/bin/bash,就是进入不了nginx容器,由此引发了一系列的排查。如果你对,docker的这个错误感兴趣,点击进入。
正题
简单的讲,/bin/sh是早期版本,是一种便携方式的解释性脚本语言,自带有posix便携式功能,以该方式声明的脚本,脚本中间发生错误会终止脚本的运行,不再运行下面的代码。
/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 sh 和man bash,就看出来了,他们展示的内容几乎是一模一样。
也就是说,在新版本的Linux内核中,老的sh已经被后来者bash整合了。
补充:docker容器使用/bin/bash命令
问题描述
本地运行命令和docker运行命令的解释器不同,在本地已经是/bin/bash,但是docker中仍然是/bin/sh,需要修改docker中/bin/sh为/bin/bash
解决方案
1、首先看docker容器的详细信息。输入“docker container ls |grep xxxx”,看其中的命令部分,如果是“/bin/sh”说明使用的不一定是bash,可能是dash解释器。
使用命令ls -l /bin/sh,如果显示的是/bin/sh -> dash,说明用的是dash
2、在DockerFile中修改CMD部分,将其设置为/bin/bash
#原先命令 CMD ./start.sh #修改为 CMD ["/bin/bash", "-c", "./start.sh"]
总结
到此这篇关于Shell编程之/bin/bash和/bin/sh区别的文章就介绍到这了,更多相关Shell /bin/bash和/bin/sh区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!