아무도 진정한 Bourne 쉘을 / bin / sh로 사용하지 않는 이유는 무엇입니까?


55

기본적으로 내가 작업 한 시스템 /bin/sh이 실제 실행 파일 이 없다는 것을 알았습니다 . 항상에 대한 심볼릭 링크입니다 dash, bashPOSIX 모드, 또는 비슷한한다.

왜? 진정한 원본을 사용하면 어떤 단점이 /bin/sh있습니까? (속도? 라이센스?)


3
당신은 리눅스를 사용한 적이 있습니까? 나는 리눅스에서 "sh를 symlink"로 본 적이있다.
— Greg Hewgill

@GregHewgill 최신 버전의 Solaris가 sh심볼릭 링크를 하지 않았 ksh습니까?
— Gilles

1
답변 중 하나에 따르면 @Gilles는 Solaris 11부터 링크되어 ksh있습니다.
— strugee

1
@GregHewgill 나는 또한 다윈 (Darwin)을 사용했다 bash.
— strugee

6
원래 / bin / sh 는 무엇을 의미 합니까? 유닉스 V1의 톰슨 쉘? 주석이없는 기능이없는 Unix V7의 Bourne 쉘 ...? SysIII, SysV, Solaris, HP / UX 중 하나는 BSD에서 재 구현입니까? 요즘 sh은 표준을 기반으로하므로 스크립트에서 표준 구문을 사용하는 한 명확하게 지정된 방식으로 작동하는 여러 구현을 가질 수 있습니다.
— Stéphane Chazelas

답변:


38

명령 기록, 멋진 리디렉션, 명령 줄 편집 기능이없는 것 같습니다. BSD는 csh이러한 이유로 C 쉘을 도입 했습니다. 또 다른 요인은 Genuine Bourne Shell이 최근에 오픈 소스 형식 으로 만 제공 되었다는 것 입니다. 라이센스가 없으면 배포 할 수 없습니다. 그것은 무료 배포판을 위해 도달하지 못했고 다른 배포판과 * BSD에는 이념적으로 적합하지 않게 만들었습니다.

그러나 이제 코드를 사용할 수 있습니다. 살펴보고 컴파일하고 회전시킬 수 있습니다.


50
그런 다음 이전에 사용했던 것으로 즉시 전환하십시오.
— Ignacio Vazquez-Abrams

24
@strugee ""기능 부족 "-왜 이것이 문제가 될까요?"예, 좋은 지적 ... 프로그래머가 어셈블리 / C / 고급 언어와 같은 쓸모없는 것을 사용하는 이유는 무엇입니까? 기계어를 직접? 사실 : 기능 = 개발 속도 증가 + 유지 관리 효율성 향상 = 비용 절감 = 더 나은 사용 : 다음 sh과 같은 점을 bash제외하고는 사용 방식과 동일합니다.
— Bakuriu

10
실제로 기능이 부족하지는 않지만 POSIX sh는 기존 Bourne 쉘이 아닌 POSIX 호환 쉘을 실행 하라는 명령을 명령합니다. POSIX하지 않는 요구 동안 sh의 수 /bin/sh, 즉 일하기위한 가장 논리적 인 디렉토리입니다.
— jlliagre

4
@Bakuriu 명령 기록과 명령 줄 편집은 실제로 스크립트에 필요하지 않은 것입니다.
— strugee

4
@strugee 그것들 만이 유일한 차이점 은 아닙니다 . 예를 들어 sh물결표와 중괄호 확장을하지 않고, 일부 내장 기능 (예 : 누락되지 pushd및 popd, select) 어떤 산술 확장을. 예를 들어 많은 변수가 없습니다 PIPESTATUS.
— Bakuriu

23

귀하의 질문에 대한 진술이 잘못되었습니다. Solaris 버전 10 까지는 레거시 True Bourne 셸을로 제공합니다 /bin/sh. 이것은 다른 쉘에서 실패 할 수있는 이전 스크립트와의 호환성을 손상시키지 않기 위해 수행되었습니다. 이 선택은 그렇지 않으면 매우 실망 스러웠습니다.

POSIX가 호환 되지 않는 레거시 Bourne 셸이 아닌 POSIX 셸을 시작하는 명령을 지시 /bin/sh하기 때문에 Solaris 11을 포함한 나머지 모든 Unix 및 Unix와 같은 릴리스가 아닌 대부분의 경우 POSIX 호환 셸을 제공 sh합니다. /bin/sh일반적으로 :

  • ksh88또는 ksh93상업적 유닉스 구현에서
  • 에 수정 bash됨 OS/X(이전에는 있었지만 zsh)
  • ash또는 pdksh다른 유도체에BSDs
  • bash또는 dashGnu / Linux 배포판.

반드시 링크 일 필요는 없지만 많은 시스템에서 Gnu / Linux에서 실제 실행 파일이 될 수 있습니다.

흥미롭게도 귀하의 질문에 가장 많이 대답 된 답변에도 불구하고 배포 개발자가 레거시 Bourne 쉘과 다른 것을 설치할 수있는 기능이 부족 /bin/sh하지는 않지만 가능한 한 POSIX 호환을 원합니다. OS와 같은 유닉스. POSIX 쉘이 기존 Bourne 쉘보다 더 많은 기능을 가지고 있다는 사실은이 표준 준수 목표의 부작용 일뿐입니다.

또한 일부 쉘은 특히 bash호출 될 때 다르게 동작하며 sh, 이는 쉘과 다른 방식으로 기능을 제거합니다.


16

내가 아는 한, Bourne 쉘은 라이센스 때문에 BSD와 GNU 프로젝트에서 사용할 수 없었습니다.

당시의 원래 유닉스에는 라이센스가 없었고 GNU 프로젝트에는 GPL 아래에있는 쉘이 필요했기 때문에 bash를 사용했습니다.

모든 BSD의 부모 인 BSD4도 마찬가지입니다. AT & T 소송으로 인해 Bourne 쉘을 포함하여 원래 Unix의 모든 소스를 다시 작성해야했습니다.

전통적인 BSD 라인에서 Bourne 쉘은 4.3BSD-Reno까지 배송되었지만 Net / 2 및 다음 4.4BSD에서는 더 이상 제공되지 않습니다. 라이센스 이유로 인해 Kenneth Almquist (보통 재라고 함)에 의해 bourne 호환, svr4와 같은 sh로 대체되었습니다.

FreeBSD에서 man sh

sh 명령 인 Thompson 쉘이 버전 1 AT & T UNIX에 나타났습니다. 버전 7 AT & T UNIX에서 Bourne 쉘로 대체되었으며 이름은 sh입니다.

이 sh 버전은 1989 년 AT & T System V Release 4 UNIX의 Bourne 쉘 이후 BSD 라이센스에 따라 다시 작성되었습니다.

따라서 두 프로젝트 모두 Bourne 쉘을 사용하지 않고 진정한 오픈 소스 쉘에 정착해야했습니다.


7

다른 문제가있었습니다. Bourne Shell은 malloc () 대신 sbrk ()를 사용하여 이식성이 떨어졌습니다.

Bourne Shell이 ​​OpenSolaris를 통해 OpenSource가 된 후, sbrk ()를 malloc ()로 Geoff Collyer (sbrk ()를 피하는 데 도움을 준 사람)의 도움으로 대체하여 hafway 휴대용 버전과 나중에 휴대용 버전을 만들었습니다. Korn Shell).

내가 Bourne Shell의 이식 가능한 버전을 만든 초기 이유는 1982 년에서 1984 년 사이에 "bsh"를 위해 작성한 History Editor를 Bourne Shell에서도 사용할 수있게했기 때문입니다. 한편, "bsh"에 대해 쓴 고유 한 특성의 대부분을 Bourne Shell에 이식했습니다.

이것은 다른 것들 중 하나입니다.

  • Cygwin을 포함한 거의 모든 곳에서 컴파일 및 작동 (bash보다 거의 2 배 빠름)
  • LRU 링 버퍼가있는 히스토리 편집기
  • 내장 TERMCAP
  • 고급 별칭 (글로벌 영구 별칭, 로컬 별칭 등)과 "dosh"내장 기능을 갖춘 Bourne Shell은 매개 변수화 가능한 별칭을 허용하는 유일한 Bourne Shell 유사 구현입니다.
  • 원시 모드에서 히스토리 편집기에서 복잡한 별명 편집을 지원합니다.
  • .sh. * 변수를 통해 exit (2) 코드의 모든 32 비트에 액세스하십시오.
  • 6 자리 해상도의 고급 자동 타이밍
  • 푸시 / 팝 / 디렉터
  • 내장 된 "찾기"
  • stderr에서 파이프
  • 더 나은 성능을 위해 vfork () 사용.
  • SVr4 Bourne Shell에서 문서화 된 모든 버그를 수정했습니다. 예를 들어 suspend는 항상 작업 제어 모드에서 작동합니다. ...

온라인 매뉴얼 페이지는 다음에 있습니다. http://schillix.sourceforge.net/man/man1/bosh.1.html 소스는 다음 위치에있는 schily 도구 상자의 일부입니다.

https://sourceforge.net/projects/schilytools/files/

http://sourceforge.net/projects/schilytools/files/schily-2015-08-18.tar.bz2 또는 최신 버전 을 사용하는 것이 좋습니다 .

PS 피드백에 관심이 있습니다


안녕 요거 왜 일부 BSD sh 또는 pdksh처럼 POSIXified 된 쉘이 아닌 Bourne 쉘로 이식합니까?
— Stéphane Chazelas

Bourne Shell 포팅은 stdio를 사용하지 않으므로 문제가되었습니다. 이것은 원래 csh 소스를 가져 와서 VAX 어셈블러로 작성된 비 stdio printf를 교체하여 컴파일하는 것과 비슷한 도전이었습니다. 그러나 이미 Bourne Shell에 많은 새로운 POSIX 기능을 추가했으며 SchilliX의 Bourne Shell을 사용하여 Korn Shell에서는 불가능한 별도의 파일 시스템에서 / anr / usr을 사용하여 부팅 할 수 있습니다.
— schily

또한 ksh의 속도가 vfork ()를 사용하여 발생하는지 확인하고 싶습니다. 이제 Bourne Shell을 vfork ()를 사용하도록 변환 한 것은 최신 ksh 버전만큼이나 빠릅니다. 이것은 원래 Bourne Shell 소스 코드로 시작할 때만 얻을 수있는 경험입니다.
— schily

그러나 POSIX를 준수 할 때까지는 많은 관심을 끌지 않을 것입니다. Bourne 쉘의 POSIX와의 비 호환성에 대해 austin 그룹 ML에 문의 한 것을 기억합니다. 현재 작업 중입니까 (Bourne 쉘과의 호환성을 깨뜨릴 것입니까)? 또한 사람들은 (최소한) POSIX sh 구문이 Bourne 쉘보다 진보 한 것으로 간주합니다. Bourne 파생 쉘을 계속 호출하면 Bourne 쉘이 잘못된 인상을 보낼 수 있습니다. bimsh (Bourne 개선 (ala vi / vim))는 어떻습니까?
— Stéphane Chazelas

My Bourne Shell은 일부 측면에서 이미 ksh보다 낫습니다. 예를 들어 더 나은 별칭, 푸시 / 팝 / 디렉토리 및 ksh가 여전히 SVr2 기반 인 경우 최신 UNIX 기능을 기반으로 한 리소스 사용 지원을 구현하십시오. 당신이 쉘에 관심이 숙련 된 것 같다, 나는 읽은 후 당신은 Bourne 쉘에서 다음보고 싶은 것에 대한 생각을 좀하고 싶습니다 : schillix.sourceforge.net/man/man1/bosh.1.html의 주 그 지금까지 모든 새 코드 #ifdef가 있으며 stderr 파이프와 같은 일부 기능은 set (1)을 통해 켜야합니다.
— schily

4

100 % 역 호환성 을 제공하는 쉘에 연결되어 있습니다 . 당신은 원래 쉘이 가진 것을 잃지 않고 그 위에 더 많은 기능을 얻습니다. 단점이 없으므로 새로운 기능을 놓치는 이유는 무엇입니까? 이것이 /bin/vi보통 vim에 연결되는 이유와 같은 이유 입니다.


5
단점은 사람들이 하나의 시스템에서 작동하는 스크립트를 작성하여 스크립트가 호환되지 않을 때 호환된다고 생각한다는 것입니다. 나는 실제로 bash가 필요하지만 / bin / sh라고 불리는 거의 백개의 젠투 쉘 스크립트를 고쳤다. / bin / sh를 bash 대신 대시로 변경하면 모두 깨졌습니다.
— Zan Lynx

3
"단점 없음"-속도. 예를 들어 다음 bash보다 훨씬 느리다dash
— strugee

@strugee 쉘에서 ms 범위의 개선 속도를 찾고 있다면 아마도 작업에 적합한 도구를 사용하고 있지 않을 것입니다.
— Chris Down

1
@ChrisDown은 "ms 범위 개선"을 정의합니까?
— strugee

2
POSIX sh 구문은 Bourne sh 구문과 완전히 호환되지 않습니다. 예를 들어, IFS=,; rm file1,file2,file3Bourne 쉘에서 해당 3 개의 파일을 제거합니다. POSIX sh에서는 그 (바보) 기능 이 제거되었습니다. Bourne 쉘용으로 작성된 스크립트가 POSIX sh와 다르게 작동하게하는 수십 가지 미묘한 차이점이 있습니다.
— Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.