Linux docker ubuntu容器:链接到bash的shell仍然启动shell

Linux docker ubuntu容器:链接到bash的shell仍然启动shell,linux,bash,shell,ubuntu,docker,Linux,Bash,Shell,Ubuntu,Docker,好了,伙计们,我试着在基于ubuntu:14.04的docker容器中安装rvm。在这个过程中,我发现有些人这样做是为了确保docker命令也能与bash一起运行: RUN ln -fs /bin/bash /bin/sh 现在奇怪的事情发生了,我希望你们中的某个人能向我解释: → docker run -it --rm d81ff50de1ce /bin/bash root@e93a877ab3dc:/# ls -lah /bin .... lrwxrwxrwx 1 root root

好了,伙计们,我试着在基于ubuntu:14.04的docker容器中安装rvm。在这个过程中,我发现有些人这样做是为了确保docker命令也能与bash一起运行:

RUN ln -fs /bin/bash /bin/sh
现在奇怪的事情发生了,我希望你们中的某个人能向我解释:

→ docker run -it --rm d81ff50de1ce /bin/bash
root@e93a877ab3dc:/# ls -lah /bin
....
lrwxrwxrwx  1 root root    9 Mar  1 16:15 sh -> /bin/bash
lrwxrwxrwx  1 root root    9 Mar  1 16:15 sh.distrib -> /bin/bash
...
root@e93a877ab3dc:/# /bin/sh
sh-4.3# echo $0
/bin/sh
有人能解释一下这是怎么回事吗?我知道我可以在dockerfile w/
bash-c
中为我的命令添加前缀,但我想了解这里发生了什么,如果可能的话,仍然可以在dockerfile中删除
bash-c
前缀

非常感谢,
Robin

这是因为bash有一种兼容模式,如果它是通过名称
sh
启动的,它会尝试模拟
sh
,如主页所示:

如果使用名称sh调用bash,它将尝试模拟启动 尽可能接近sh的历史版本的行为,而 也符合POSIX标准。当作为 交互式登录shell,或带有--login的非交互式shell 选项,它首先尝试从中读取和执行命令 /etc/profile和~/.profile,按顺序排列。--noprofile选项 可以用来抑制这种行为。当作为交互函数调用时 名为sh,bash的shell查找变量ENV,展开其 值(如果已定义),并使用扩展值作为 要读取和执行的文件。因为作为sh调用的shell不会 尝试从任何其他启动文件读取和执行命令 --rcfile选项无效。使用名称sh调用的非交互式shell不会尝试读取任何其他启动文件。什么时候 作为sh调用,bash在启动文件完成后进入posix模式 阅读