Bash,Bourne和Korn外壳程序是否已在OSX中编译为一个二进制文件?


7

在OSX 10.8上,如果比较bash,sh和ksh的二进制文件,几个不同的shell选项,则它们的大小相同。如果进一步介绍cmp二进制文件,那么二进制文件之间似乎只有一个字节的差异。

从表面上看,这似乎表明在每个二进制文件中都提供了支持所有不同shell的所有代码,但是您可以访问哪个子集取决于最终执行哪个shell。

  1. 任何人都可以确认二进制文件实际上是以这种方式编译的吗?
  2. 从Apple的角度来看,以这种方式组合所有外壳是否有任何好处?

Answers:


4

我认为您的基本假设是错误的。检查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肯定来自不同的来源:


哦,是的,你绝对是对的。应该一直在看cmp -l而不是cmp。谢谢。
nsg

2
有趣的是,/ bin / sh实际上 bash(尽管它会根据名称在sh仿真模式下运行)。在OS X的某些过去版本中,它要么是/ bin / bash的硬链接,要么是相同的副本,但是至少在10.8.3中,它稍有不同。另一方面,/ bin / ksh是一个完全不同的程序,恰好大小相同。
Gordon Davisson

9

ksh和bash完全不同,但是bash和sh二进制文件大部分相同。OS X的sh是bash的一个版本,它具有:

  • 已启用POSIX模式。bash默认情况下不符合POSIX。
  • 具有不同的启动行为。例如sh -l不阅读~/.bash_profile/
  • 默认情况下启用xpg_echo。因此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)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.