如果我这样做ls -l /bin/sh
:我得到
lrwxrwxrwx 1 root root 4 Jan 9 00:01 /bin/sh -> bash
但是,当我启动时sh
,我得到了一个完全不同的提示,我的~/.bashrc
没有来源,如果我手动来源它,我得到一堆语法错误。
怎么回事?我猜这是某种兼容模式吧?
编辑:
运行 Endeavour OS(基于 arch)
echo $PATH
给出:
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl
是的,/usr/bin/sh 也是 bash 的符号链接。
答案1
是的,当以 形式调用时sh
,bash 会进入完整的 Bourne shell 兼容模式。从手册页中可以看到:
如果使用名称 sh 调用 bash,它会尝试尽可能地模仿 sh 的历史版本的启动行为,同时符合 POSIX 标准。当作为交互式登录 shell 或使用 --login 选项的非交互式 shell 调用时,它首先尝试按顺序从 /etc/profile 和 ~/.profile 读取并执行命令。可以使用 --noprofile 选项来禁止此行为。当使用名称 sh 调用作为交互式 shell 时,bash 会查找变量 ENV,如果已定义则扩展其值,并使用扩展的值作为要读取和执行的文件的名称。由于作为 sh 调用的 shell 不会尝试从任何其他启动文件中读取和执行命令,因此 --rcfile 选项无效。使用名称 sh 调用的非交互式 shell 不会尝试读取任何其他启动文件。当作为 sh 调用时,bash 在读取启动文件后进入 posix 模式。