Shell /bin/bash和/bin/sh区别
血煞长虹 人气:0前言
早期,学过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"]
总结
加载全部内容