두 가지 유형의 코드가 사용되고 있습니다.
#!/usr/bin/sh
과:
#!/user/bin/bash
이 온라인을 검색했는데 의견이 많이 다릅니다. 대부분의 웹 사이트에서 내가 본 설명 sh
은 이전보다 오래된 것으로 bash
실제 차이는 없습니다.
누군가 이것의 차이점을 알고 있습니까? 하나를 다른 것보다 사용할 때 실용적인 예를 들어 줄 수 있습니까?
두 가지 유형의 코드가 사용되고 있습니다.
#!/usr/bin/sh
과:
#!/user/bin/bash
이 온라인을 검색했는데 의견이 많이 다릅니다. 대부분의 웹 사이트에서 내가 본 설명 sh
은 이전보다 오래된 것으로 bash
실제 차이는 없습니다.
누군가 이것의 차이점을 알고 있습니까? 하나를 다른 것보다 사용할 때 실용적인 예를 들어 줄 수 있습니까?
답변:
bash
sh
즉 , 수퍼 세트입니다 . 당신이 할 수있는 모든 일은에서 sh
할 수 있습니다 bash
.
Bash에는 스크립트를보다 쉽게 작성할 수있는 더 많은 기능 (분기, 내장, 배열)이 있습니다. 일부 나중에 * nix'es는이 /bin/sh
에 대한 링크로/bin/bash
튜토리얼 이 무엇인지에 대한 자세한 설명
sh
)이 확장되지 않은 한 가지 이유는 다른 사람이 Bash를 작성했기 때문입니다. 또한 라이센스 문제가 있다고 생각합니다. Bourne Shell에 관한 기사 en.wikipedia.org/wiki/Bourne_shell
sh
하면 많은 스크립트가 손상되어 예상되는 구문을 분석하는 방식에 의존하게됩니다. Linux 사용자는 신경 쓰지 않아도되지만 Solaris, AIX 또는 HP-UX에서 수천 달러를 소비하는 사람들은 매우 귀찮을 수 있습니다.
전통적으로 / bin / sh는 원래 Bourne 셸이었으며 기록이나 명령 줄 편집 및 작업 제어가 없었습니다.
지난 15 년 정도 동안 대부분의 유닉스는 POSIX 쉘을 설치했거나 적어도 ksh 또는 bash (거의 POSIX와 유사 함)를 갖고 있지만 여전히 / bin / sh에 더 제한된 쉘이 있습니다.
그 이유는 이전 sh
명령 을 기대하는 이전 쉘 스크립트 가 여전히 작동하기 때문입니다.
문자를 좋아하기 때문에 {
, }
그리고 !
bash는 특별한 의미를 가지고, 그것은 (를 탈출하지 않고) 그 문자를 사용하여 이전 쉘 스크립트가 실패 할 가능성이 있습니다.
(Bourne 쉘은 !!{1,2}
문자 그대로 사용하는 반면, bash는 이전 명령 ( !!
)과 중괄호 확장 이 반복됨으로 해석합니다 ).
Linux에서 sh
명령은 거의 항상 bash
동일한 기능을 가진에 대한 링크 일뿐 입니다.
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 용 스크립트를 작성하는 것이 더 쉽다고 생각합니다.
sh
과bash
같습니다 : http://en.wikipedia.org/wiki/Comparison_of_command_shells