아무도 진정한 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물결표와 중괄호 확장을하지 않고, 일부 내장 기능 (예 : 누락되지 pushdpopd, 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상업적 유닉스 구현에서
  • 에 수정 bashOS/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.