Bash, Bourne 및 Korn 쉘이 OSX에서 하나의 바이너리로 컴파일됩니까?


7

OSX 10.8에서 몇 가지 다른 쉘 옵션 인 bash, sh 및 ksh의 바이너리를 비교하면 크기가 동일합니다. 더 이상 cmp바이너리 를 가져 가면 바이너리 사이에 1 바이트 차이 만있는 것 같습니다.

이것은 피상적으로 모든 다른 쉘을 지원하는 모든 코드가 각 바이너리에서 사용 가능하지만 액세스 할 수있는 서브 세트는 실행하는 쉘에 따라 다릅니다.

  1. 바이너리가 실제로 이런 식으로 컴파일되었음을 확인할 수 있습니까?
  2. 애플의 관점에서 볼 때, 이러한 방식으로 모든 쉘을 결합하면 어떤 이점이 있습니까?

답변:


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가 아닌 cmp -l을보고 있어야합니다. 감사.
nsg

2
흥미롭게도, / 빈 / SH 사실 이다 (그 이름에 따라 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에 있지만 EDITOR 또는 bash에 있습니다.

$ 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/ 에서 다운로드 할 수 있습니다 .

에서 남자 bash는 :

bash가 sh라는 이름으로 호출되면 POSIX 표준도 준수하면서 sh의 히스토리 버전 시작 동작을 최대한 가깝게 모방하려고합니다.

그러나 원래 Bourne 쉘의 다른 측면을 모방하지는 않습니다.

원래 Bourne 쉘은 더 이상 유지 보수되지 않으며 / bin / sh는 이제 POSIX를 준수하는 다른 쉘이됩니다. OS X의 sh는 다른 플랫폼에서 우분투의 대시와 같이 / bin / sh와 반드시 작동하지 않는 bashism 을 사용할 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.