sh가 대시에 연결되는 지점은 무엇입니까?


35

sh상징적으로 연결되는 요점이 무엇인지 궁금합니다 dash. 나는 그것이 dash보다 빠르다는 것을 이해 bash하지만 원래 sh쉘이 왜 존재하지 않는지 잘 모르겠습니다 sh.

또는 왜 sh연결 되지 않은 것이 bash있습니까?

답변:


70

“원래 sh 쉘이없는 이유”에 대한 짧은 대답은 원본 sh sh가 없다는 것입니다.

글쎄요, 톰슨 쉘 입니다. 버전 1은 오늘날 우리가 알고있는 몇 가지 기능, 특히 리디렉션 및 파이프를 가지고있었습니다 ( 유닉스 초기 역사에 관한 Dennis Ritchie의 논문 읽기 ). 이후 버전 은로 백그라운드 실행 &, 글 로빙 (외부 프로그램으로 구현) 및 일부 인용 형식과 같은 기능을 추가 했지만 변수 나 중첩 된 제어 구조가 없었습니다. 조건부와 루프는 외부 프로그램 if(하나의 조건과 하나의 명령을 인수로 사용함)과 goto(스크립트 파일에서 부모의 파일 위치를 변경하여 작동)를 통해 제공되었습니다.

1979 년에 유닉스 V7 , 톰슨 쉘로 대체되었다 /bin/sh바이 Bourne 쉘 . 첫 번째 릴리스에는 오늘날 많은 기능 이 이미 포함 되어 있으며 이후 버전에서는 더 많은 기능 이 도입되었습니다 . 몇 년 후 Korn 쉘 이 등장하면서 기능 세트가 커졌습니다. 많은 유닉스 변종들이 이름으로 설치했다 ksh.

1992 년에 POSIXsh 는 기본적으로 Bourne에 몇 가지 기능을 추가 한 최소 기능 세트를 체계화했습니다 . "Unix"라는 시스템은 최소한 이러한 기능을 구현해야했습니다. 상업용 Unix 시스템은 일반적으로 ksh를 POSIX sh로 사용했지만 일부 (예 : OSF / 1 )에는 고유 한 기능이있었습니다.

Bourne 쉘이나 Korn 쉘은 상당히 최근까지 공개 소스가 아니 었으므로 1990 년대 중반에 Linux 세계가 형성되기 시작했을 때 사용할 수 없었습니다. /bin/sh다른 것이어야했다. 대부분의 Linux 배포판은 GNU 프로젝트 의 쉘인 bash 용 으로 스크립트 기능 측면에서 Bourne과 Korn 사이에 있으며 대화식으로 사용하는 것보다 훨씬 낫습니다. 유일한 대안은 무료 pdksh 같은 ( "공개 Korn 쉘")이었다 (지금은 중단하지만, 같은에 살고 mksh 되고, 적극적으로 개발 ),하지만 난으로 pdksh 같은를 사용하는 리눅스 배포판을 기억하지/bin/sh, 나는 왜 리눅스 배포판이 항상 GNU / Linux 배포판 이었기 때문에 기본적으로 GNU 버전이 존재했던 도구의 GNU 버전을 제공하기 때문에 왜 그런지 모르겠다.

Alshquist 쉘인sh “ash”라는 여러 오픈 소스 구현도 있었지만, 사람들이 사용하고자하는 POSIX 기능이 부족하여 매우 불완전했습니다. 데비안 관리자 인 Herbert Xu 인 프로그래머는 재를 확장하여 POSIX를 준수하도록했습니다. 결국 그의 버전은 대시로 이름이 바뀌었고, bash 대신 데비안에서 그것을 만들려는 약간의 압박이있었습니다 . 데비안 체계적으로 치료 bashisms (에서 bash는 특정 기능의 사용을 시작하기 전에 우분투 시작 으로 스크립트) 버그 . 둘 다 나중에 전환했습니다 ( 우분투 6.10 , 데비안은 2009 년에만) ( 레니의 목표였습니다./bin/sh#!/bin/sh 그러나 스위치는 레니 릴리스 후에 만 ​​이루어졌습니다.

주요 대시로보다는 떠들썩한 파티를 사용하는 이유/bin/sh그 속도가 매우 빠르고 점이다. 이것은 부팅 시간을 처음부터 줄이려고 노력했던 우분투에게 특히 중요했습니다. 또한 Dash는 bash보다 적은 메모리를 사용하는 경향이 있습니다. 이는 기본 프로그램이 종료 될 때 약간의 정리 만 수행하는 래퍼 스크립트에 다소 중요합니다. dash의 또 다른 장점은 libc (핵심 시스템 라이브러리)에만 의존하는 반면 bash는 터미널 지원 라이브러리 (스크립트 없이도 시작할 수 없음)에 의존한다는 것입니다. 이는 대시가 손상된 시스템에서 계속 작업 할 수있는 더 나은 기회를 의미합니다.

21 세기 중 어느 시점에서 Korn 쉘은 오픈 소스가되었고 Bourne 쉘의 오픈 소스 버전이 등장했습니다 (개발은 몇 년 전에 중단 되었기 때문에 구 버전). 그러나 대시와 배쉬는 리눅스 세계에서 너무나 확고하게 자리 잡았는데, 오늘날 가치가 역사적 일 뿐이므로 특히 Bourne 쉘을 받아 들일 수 없었습니다. Dash는 명백한 이점이 있었기 때문에 bash를 대체했지만 다른 경쟁자는 /bin/sh.


ksh93을 / bin / sh로 사용하는 데는 합당한 이유가 있다고 주장합니다. 이는 사용 가능한 최고 성능의 POSIX 셸 중 하나입니다. 대시의 편재성은 타이밍의 문제라고 동의했다.
Charles Duffy

2
@CharlesDuffy Ksh93은 복잡한 작업을 수행하는 데 더 빠르지 만 시작 시간과 대시 system가 응용 프로그램의 모든 호출과 같은 주요 스크립트 인 경우 대시 보드보다 빠릅니다 .
질 'SO-정지 존재 악마'

21

속도 및 POSIX 준수 (즉, 이식성)가 주요 요인입니다. 그이 기억 /bin/sh나 우분투의 이전 버전 및 / 또는 다른 시스템에서 온하지 않을 수있는 시스템 스크립트위한 것입니다.

확실하고 반짝이는 기능은 bash우리 사용자에게는 사용하기 편리하지만 POSIX 호환 쉘을 사용하면 여러 가지 다른 서버 / 시스템을 관리 해야하는 환경에서 실행하는 데 큰 차이가 있습니다. 특히, 새로운 sysadmin이고 많은 스크립트가있는 상속 된 환경 인 경우.

원래 Bourne 쉘이없는 이유는 간단합니다. 원래 AT & T Bell Labs가 소유 한 독점 제품입니다.

또한 우분투 위키에는 실제로 이에 대한 명확한 설명이 있습니다.

이 변경은 왜 이루어 졌습니까? 기본 쉘을 전환하는 주요 이유는 효율성이었습니다. bash는 대화식 사용에 적합한 뛰어난 기능을 갖춘 뛰어난 쉘입니다. 실제로 여전히 기본 로그인 쉘입니다. 그러나 대시와 비교하여 시작하고 작동하는 것은 다소 크고 느립니다. Ubuntu 부팅 프로세스의 일부로 많은 수의 셸 인스턴스가 시작됩니다. Ubuntu 핵심 개발 팀은 / bin / dash에서 명시 적으로 실행되도록 개별적으로 변경하는 대신 상당한 지속적인 유지 관리가 필요하고 세심한주의를 기울이지 않으면 회귀하기 쉬운 변경 인 것보다는 단순히 변경하는 것이 가장 좋다고 생각했습니다. 기본 쉘 Ubuntu 6.10의 부팅 속도 향상은 종종 Instart 시스템의 향후 개발을위한 훌륭한 플랫폼이지만 Ubuntu 6에서는 업 스타트 (Upstart)로 인해 잘못되었습니다. 10은 주로 약간의 동작 변경만으로 System V 호환성 모드에서 실행되었습니다. 이러한 개선은 실제로 / bin / sh가 변경 되었기 때문입니다.

다음은 이식성에 대한 참고 사항입니다.

데비안 정책 매뉴얼은 오랫동안 '/ bin / sh'를 인터프리터로 지정하는 쉘 스크립트는 POSIX 기능 만 사용해야합니다. 사실,이 요구 사항은 우분투 프로젝트가 시작되기 훨씬 전부터있었습니다. 또한 BSD 또는 Solaris와 같은 다른 Unix 시스템으로 이식 가능할 것으로 예상되는 모든 쉘 스크립트는 이미이 요구 사항을 준수했습니다. 따라서이 변경으로 인한 호환성 영향은 최소화 될 것이라고 생각했습니다.

https://wiki.ubuntu.com/DashAsBinSh를 참조 하십시오


dash필요하지 않은 기능은 지원하지 POSIX않습니까?
NerdOfLinux

@NerdOfLinux POSIX 외에 / bin / sh가 무엇을 지원하는지는 중요하지 않습니다. 중요한 것은 모든 POSIX를 지원하며 가능한 한 빠르다는 것입니다. dash가 이러한 요구 사항을 충족하는 한 / bin / sh는 이에 연결할 수 있습니다.
Guntram Blohm은 Monica

9

GNU / 리눅스 배포판에서 "original /bin/sh"은 실제로 Bash입니다.

GNU는 GPL 하의 Bourne과 같은 쉘을 원했기 때문에 /bin/shGPL 라이센스가 아닌 Bourne 대신 Bash를 Bash로 선택했습니다 . 현대 리눅스 배포판은이 결정이 /bin/shBash가되기 위한 사실상의 표준이되었다는 점까지 이어졌습니다 . 원래 Bourne 쉘 ( "sh")은 Solaris 10만큼 최근에도 Linux 이외의 다른 유닉스에서도 사용되었지만 Linux 배포판의 주류는 아닙니다.

/bin/shbash에서 dash로 전환 하는 것은 속도에 의해 크게 동기를 얻은 데비안의 결정 (우분투에서 상 속됨)이었습니다. 초기화 스크립트.

Bash는 사용자의 기본 대화 형 / 로그인 셸로 계속 사용되지만 Dash는 /bin/shinit 스크립트와 같은 시스템 스크립트에 대해 실행되는 하나입니다.

대시는 매우 빠르지 만 POSIX와 매우 호환됩니다. 표준은 Bourne 쉘과 밀접하게 정렬되어 있습니다. 따라서 Bash에서 Dash로 전환하면 Bourne과 더 밀접하게 정렬 된 쉘로 다시 이동합니다.


"대시는 매우 빠르지 만 POSIX와 매우 밀접하게 호환됩니다. 표준은 Bourne 쉘과 밀접하게 정렬되어 있습니다."예, POSIX는와 밀접한 관련이 있지만 ksh, 저는 말합니다. POSIX 인 산술 확장`$ (())`가있는 Bourne 쉘은 기억 나지 않습니다.
Sergiy Kolodyazhnyy

1
또한 Bourne ^에는 파이프 문자가 있습니다. 따라서 POSIX sh에서는 echo foo ^ cat방출 foo ^ cat되지만 fooBourne 에서는 방출 됩니다 . 이 특정 테스트는 Autoconf가 두 가지를 구별하는 방법입니다.
Charles Duffy

흥미 롭기 때문에 POSIX sh는 Korn을 의미합니까?
thomasrutter

0

/bin/sh/bin/dash내가 호환성 이유라고 생각하는 것에 연결되어 있습니다. 많은 스크립트는 단순히

#!/bin/sh

따라서 dash심볼릭 링크 로 이동하여 심볼릭 링크를 /bin/sh만들지 않으면 전혀 존재하지 않으면 많은 스크립트가 제대로 실행되지 않거나 전혀 실행되지 않습니다.

변화는에서 만들어졌다 bashdash따라 때문에 https://wiki.ubuntu.com/DashAsBinSh :

기본 쉘을 전환하는 주요 이유는 효율성이었습니다. bash는 대화식 사용에 적합한 뛰어난 기능을 갖춘 뛰어난 쉘입니다. 실제로 여전히 기본 로그인 쉘입니다. 그러나 대시와 비교하여 시작하고 작동하는 것은 다소 크고 느립니다. Ubuntu 부팅 프로세스의 일부로 많은 수의 셸 인스턴스가 시작됩니다. Ubuntu 핵심 개발 팀은 / bin / dash에서 명시 적으로 실행되도록 개별적으로 변경하지 않고 상당한 지속적인 유지 관리가 필요하고 세심한주의를 기울이지 않으면 회귀 할 수있는 변경이 아니라 단순히 변경하는 것이 가장 좋다고 생각했습니다. 기본 쉘

sh에 연결되어 있지 않습니다 bash때문에,

데비안 정책 매뉴얼은 오랫동안 '/ bin / sh'를 인터프리터로 지정하는 쉘 스크립트는 POSIX 기능 만 사용해야합니다.

당신이 사용하고자하는 경우 bash로서 /bin/sh:

문제점이 더 널리 퍼져 있고 기본 시스템 쉘을 다시 변경하려는 경우, 패키지 관리 시스템에 / bin / sh로 대시 설치를 중지하도록 지시 할 수 있습니다.

sudo dpkg-reconfigure dash

dashbash가 제공하지 않는 기능은 다음 과 같습니다.

bash가 제공하지 않는 대시의 일부 기능에 의존하는 몇 가지 스크립트가있을 가능성이 있습니다!


나는 호환성이 중요한 요소라는 것을 이미 알고 있었지만 그렇게 명확하지 않고 더 깊이있는 답변을 찾고있었습니다 ...
NerdOfCode

2
그래서 원래의 Bourne 쉘을 설치 인 경우 sh/bin/sh,하고자하는 부트 스크립트까지이 나사?
디저트

아마도 실제 세계에 배포하기 전에 가상 머신에서 먼저 시도해 보는 것이 가장 좋습니다 ...
NerdOfCode

2
/bin/sh배포판에서 제공하는 쉘로 부팅 스크립트 등을 대상으로했기 때문에 그대로 두어야 합니다. 그러나 Bourne으로 바꾸면 대부분 호환됩니다. 그래도 약간의 차이와 코드의 양 때문에 차이가 발생할 것이라고 생각합니다. 물론 사용자 정의 해시 뱅이있는 스크립트에서 쉘을 자유롭게 사용할 수 있습니다.
thomasrutter

1
@mckenzm 어떤 쉘 /bin/sh링크가 특정 사용자가 초기 로그인 쉘로 설정 한 것과 분리되어 있습니다. 의 대상 /bin/sh사용자가 찾고있는에 따라, 당신은하지 않습니다 어떻게 사용할 필요 sudo루트 사용자 역할의 다른 방법을 - 또는이 -을 변경합니다. 또한 일반적으로 모든 패키지에 대해 dpkg-reconfigure루트로 실행해야합니다. 반대로 사용자는 일반적으로 자신의 초기 로그인 쉘을 변경할 수 있으며 chsh명령을 사용 하여 변경할 수 있습니다 . 초기 로그인 쉘의 이름도 입력 $SHELL되며 일부 대화 형 비 로그인 쉘에도 사용됩니다.
엘리아 카간
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.