Answers:
我认为您的基本假设是错误的。检查10.8.3:
pse@Fourecks:~$ ls -l $(type -p sh bash ksh)
-r-xr-xr-x 1 root wheel 1333920 Oct 16 2012 /bin/bash*
-r-xr-xr-x 1 root wheel 1380304 Oct 16 2012 /bin/ksh*
-r-xr-xr-x 1 root wheel 1334000 Oct 16 2012 /bin/sh*
pse@Fourecks:~$ cmp -l $(type -p sh bash) | wc -l
cmp: EOF on /bin/bash
1138124
pse@Fourecks:~$ cmp -l $(type -p sh ksh) | wc -l
cmp: EOF on /bin/sh
1238180
从技术上讲,sh
和之间有一些相似之处bash
(稍后也可以使其表现得像sh
),但ksh
肯定来自不同的来源:
ksh和bash完全不同,但是bash和sh二进制文件大部分相同。OS X的sh是bash的一个版本,它具有:
sh -l
不阅读~/.bash_profile/
。echo
就像这样echo -e
,它不支持任何选项。缺省的FCEDIT在sh中是ed,在EDITOR中是ed,或者在bash中是ed:
$ diff -y --suppress-common-lines -W 80 <(strings /bin/bash) <(strings /bin/sh)
> /bin/bash
${FCEDIT:-${EDITOR:-ed}} | ${FCEDIT:-ed}
@(#)PROGRAM:bash PROJECT:bash-86.1 | @(#)PROGRAM:sh PROJECT:bash-86.1
$ grep -rF '${FCEDIT:-${EDITOR:-ed}}' ~/Code/Source/bash-86.1/
bash-86.1/bash-3.2/builtins/fc.c:# define POSIX_FC_EDIT_COMMAND "${FCEDIT:-${EDITOR:-ed}}"
bash-86.1/bash-3.2/builtins/fc.def:# define POSIX_FC_EDIT_COMMAND "${FCEDIT:-${EDITOR:-ed}}"
可以从http://opensource.apple.com/tarballs/下载该源。
来自man bash:
如果使用名称sh调用bash,则它会尝试尽可能接近于sh的历史版本的启动行为,同时也要符合POSIX标准。
但是,它没有模仿原始Bourne外壳的其他方面。
不再维护原始的Bourne shell,并且/ bin / sh现在意味着是其他仅符合POSIX的shell。OS X的sh允许使用不一定与其他平台上的/ bin / sh一起使用的bashism(例如Ubuntu上的dash)。