bash와 sh의 차이점은 무엇입니까?


28

두 가지 유형의 코드가 사용되고 있습니다.

#!/usr/bin/sh

과:

#!/user/bin/bash

이 온라인을 검색했는데 의견이 많이 다릅니다. 대부분의 웹 사이트에서 내가 본 설명 sh은 이전보다 오래된 것으로 bash실제 차이는 없습니다.

누군가 이것의 차이점을 알고 있습니까? 하나를 다른 것보다 사용할 때 실용적인 예를 들어 줄 수 있습니까?


다른 쉘에 대한 일반적인 개요는 다음 shbash같습니다 : http://en.wikipedia.org/wiki/Comparison_of_command_shells
akira

답변:


34

bashsh즉 , 수퍼 세트입니다 . 당신이 할 수있는 모든 일은에서 sh할 수 있습니다 bash.

Bash에는 스크립트를보다 쉽게 ​​작성할 수있는 더 많은 기능 (분기, 내장, 배열)이 있습니다. 일부 나중에 * nix'es는이 /bin/sh에 대한 링크로/bin/bash

튜토리얼 이 무엇인지에 대한 자세한 설명


5
@Saif Bechan : Bourne 쉘 ( sh)이 확장되지 않은 한 가지 이유는 다른 사람이 Bash를 작성했기 때문입니다. 또한 라이센스 문제가 있다고 생각합니다. Bourne Shell에 관한 기사 en.wikipedia.org/wiki/Bourne_shell
Felix

7
제거 sh하면 많은 스크립트가 손상되어 예상되는 구문을 분석하는 방식에 의존하게됩니다. Linux 사용자는 신경 쓰지 않아도되지만 Solaris, AIX 또는 HP-UX에서 수천 달러를 소비하는 사람들은 매우 귀찮을 수 있습니다.
njd

3
... 그리고 훨씬 더 재미있는 Ubuntu symlinks / bin / sh는 대시입니다. 대시는 완전히 sh 또는 bash를 준수하지 않지만 더 빨리 시작해야합니다. 시스템이 부팅 될 때 모든 init.d 스크립트가 실행되고 전체적으로 절약 된 시간이 그만한 가치가 있다고 생각합니다.
kbyrd

8
Dash가 완전히 호환됩니다. 문제는 일부 사람들이 / bin / sh라는 스크립트를 작성하지만 스크립트 자체가 작동하려면 / bin / bash가 필요하다는 것입니다. 대부분의 경우 / bin / sh는 단순히 / bin / bash를 가리 키기 때문에 아무도 문제를 인식하지 못합니다.
davr

8
@Saif : sh단순히 확장되지 않은 또 다른 이유가 있습니다 . 소스 코드는 순수한 지옥입니다. 보세요. 있어 가정 C ...로
grawity

6

전통적으로 / bin / sh는 원래 Bourne 셸이었으며 기록이나 명령 줄 편집 및 작업 제어가 없었습니다.

지난 15 년 정도 동안 대부분의 유닉스는 POSIX 쉘을 설치했거나 적어도 ksh 또는 bash (거의 POSIX와 유사 함)를 갖고 있지만 여전히 / bin / sh에 더 제한된 쉘이 있습니다.

그 이유는 이전 sh명령 을 기대하는 이전 쉘 스크립트 가 여전히 작동하기 때문입니다.
문자를 좋아하기 때문에 {, }그리고 !bash는 특별한 의미를 가지고, 그것은 (를 탈출하지 않고) 그 문자를 사용하여 이전 쉘 스크립트가 실패 할 가능성이 있습니다.
(Bourne 쉘은 !!{1,2}문자 그대로 사용하는 반면, bash는 이전 명령 ( !!)과 중괄호 확장 이 반복됨으로 해석합니다 ).

Linux에서 sh명령은 거의 항상 bash동일한 기능을 가진에 대한 링크 일뿐 입니다.


2
Bash는 / bin / sh로 호출 된 경우 sh- 호환 모드에서 동작해야하지만 항상 그런 것은 아닙니다. 우분투가 / bin / sh를 / bin / bash로 링크에서 / bin / dash로 링크로 전환했을 때 많은 것들이 깨졌습니다. 파산 한 것들이 표준 sh를 사용해야했을 때 bashism을 가정했습니다.
Broam

4

sh는 Bourne 쉘 또는 / bin / sh를 의미 할 수 있으며, 이는 대부분의 최신 플랫폼에서 다른 (POSIX 호환) 쉘입니다. "POSIX 쉘"은 POSIX 모드에서 bash 또는 기본적으로 ksh 또는 dash로 구현되는 POSIX의해 정의 된 추상 입니다. / bin / sh는 POSIX 쉘이라고도합니다. 대부분의 플랫폼에서 POSIX를 따르는 쉘이기 때문입니다. 원래 Bourne 쉘은 POSIX 쉘이 아닙니다.

bashref에는 bash와 Bourne 쉘차이점 목록이 있습니다 . POSIX 모드에서 bash가 호출 될 때 변경 사항man bash 목록이 있습니다 .

/ bin / sh는 OS X에서 심볼릭 링크 또는 하드 링크가 아니지만 / bin / bash와 크기가 거의 같습니다.

$ ls -li /bin/{ba,}sh
29631757 -r-xr-xr-x  1 root  wheel  1333920 Jul 26 01:52 /bin/bash
29631758 -r-xr-xr-x  1 root  wheel  1334000 Jul 26 01:52 /bin/sh

남자 배쉬 :

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

Bourne 쉘의 모방은 달리 제한적입니다. bash +B(Bourne)은 실제로 괄호 확장과 같은 기능을 비활성화합니다.

$ sh
$ echo {a,b}
a b
$ echo $BASH_VERSION
3.2.48(1)-release
$ bash +B
$ echo {a,b}
{a,b}

그러나 POSIX 모드를 비활성화하더라도 echo echo -e는 기본적으로 다음 과 같이 작동합니다 .

$ sh
$ shopt -uo posix
$ echo '1\b2'
2

/ bin / sh는 Ubuntu 에서 대시 이므로 일부 bashism 은 OS X에서는 / bin / sh와 작동하지만 Ubuntu는 작동하지 않습니다.

원래 Bourne 쉘에 대한 스크립트를 실제로 작성하려면 #!/usr/bin/env bash +B대신 사용할 수 있습니다 .

POSIX 사양이나 Bourne 쉘의 일부가 아닌 기능을 피하거나 다른 쉘로 모든 것을 테스트하는 것보다 bash 용 스크립트를 작성하는 것이 더 쉽다고 생각합니다.


2

실제로 / bin / sh는 / bin / bash에 대한 링크 일 수 있지만 sh로 시작하면 다르게 동작합니다. bash 맨 페이지에서 :

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

따라서 sh역사적인 sh 동작을 모방하려고 시도합니다. 마찬가지로 bash대화 형 로그인 셸처럼 최대한 유용합니다.


2

많은 시스템과 특히 Solaris에서 bash는 동적으로 연결되고 sh는 정적으로 연결됩니다. 이로 인해 보안 위협이 발생할 수 있으므로 루트 사용자는 / bin / sh를 쉘로만 사용해야합니다 (루트로 로그인해야하는 경우).


2
또한 무언가 잘못 ldconfig되었거나 /lib디렉토리가 어떤 이유로 인해 삭제 된 경우 비상시에 유용 할 수 있습니다 .
LawrenceC
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.