내가 본 대부분의 쉘 스크립트(직접 작성하지 않은 스크립트 제외)에서 shebang이 #!/bin/sh
. 도 존재합니다.
이것이 거의 어디에나 있고 많은 Linux 및 BSD 시스템에서 기본값으로 사용되는 경우가 많기 때문에 /bin/sh
이를 선호할 이유가 있습니까 ?/bin/bash
bash
답변1
- 일부 시스템은 기본적으로 bash를 제공하지 않습니다(예: FreeBSD).
- bash가 설치되어 있어도 .bash에 위치하지 않을 수 있습니다
/bin
. - 대부분의 간단한 스크립트에는 bash가 필요하지 않습니다.
- POSIX 셸을 사용하면 이식성이 더 뛰어나고 스크립트는 더 다양한 시스템에서 실행될 수 있습니다.
답변2
Linux(Debian 관련: Ubuntu, Mint 등)의 대부분의 시스템 스크립트는 이러한 시스템의 기본 /bin/sh인 더 빠른 대시에서 실행되도록 작성되었습니다. 두 가지 이유가 있습니다:
시스템 속도. 대시 코드가 작을수록 더 빠르게 로드되고 더 빠르게 실행됩니다. 쉘 스크립트 프로그래머 측에서는 약간의 (작은?) 추가 노력(비용)이 필요합니다.
안전. 다양한 껍질은 벌레를 예방하는 데 도움이 됩니다. 데비안 시스템은 기본 쉘에는 그러한 취약점이 없기 때문에 대부분 쉘쇼크에 취약하지 않습니다.
Bash는 실제로 기본 쉘입니다사용자, 더 강력하고 코딩을 더 쉽게 만드는 요소가 더 많기 때문입니다. 이는 sh
Mac OS의 기본값이기도 합니다(/bin/sh에서 연결됨). 그러나 bash
링크 이름으로 호출하면 sh
posix 호환 쉘로 시작됩니다.
답변3
다른 사람들은 이 질문의 전제가 Bourne Again 쉘이 기본이고 어디에나 존재한다는 것이며 이는 완전히 거짓이라고 지적했습니다.
그 외에도 쉘 스크립트를 해석하기 위해 Bourne Again 쉘 이외의 도구를 사용하는 데는 좋은 이유가 있습니다. 이러한 이유로 인해 대규모 Ubuntu 및 Debian 프로젝트는 bashism을 제거하고 시스템 초기화로 실행되는 가능한 한 많은 쉘 스크립트를 만들기 위해 수년 동안 노력했습니다.많은시스템 5 쉘 스크립트 rc
) 및 패키지 설치/제거를 사용하여데비안 Almquist 쉘Bourne Again 쉘 대신.
간단히 말해서 Bourne Again 쉘은 대화형 기능으로 가득 차 있지만 POSIX 호환 쉘 스크립트에 대한 가장 빠른 쉘 해석기는 아닙니다. 따라서 쉘 스크립트를 POSIX와 호환되게 만들고 더 가벼운 프로그램(예: Debian Almquist 쉘)을 사용하여 이를 해석할 수 있다면 시스템 성능이 더 좋아질 것입니다. (결국 데비안은 너무 깊이 내장되어 있고 너무 광범위하며 제거하기에는 너무 유용한 POSIX가 아닌 여러 쉘 구성에 대한 지원을 추가하기 위해 Almquist 쉘을 약간 조정해야 했습니다.)
이 모든 결과로 부팅 성능이 크게 향상되었습니다.
따라서 고려해야 할 두 가지 유형의 쉘이 있습니다.
- 모든 멋진 대화형 기능을 갖춘 쉘은 다음과 같이 구성됩니다.대화형 로그인 셸계정 데이터베이스의 사용자용입니다.
- 많은 수의 스크립트를 빠르게 해석하는 쉘로, 다음과 같이 사용됩니다.스크립트 인터프리터쉘 스크립트를 통해.
이것을 "선호 /bin/sh
"라고 부르는 것은 지나치게 단순화된 것입니다. 데비안은 실제로 적어도둘표적:
Debian Almquist 쉘, Z 쉘(POSIX 모드), Bourne Again 쉘(POSIX 모드), MirBSD Korn 쉘 및 기타 쉘을 사용하는 관리자에게는
/bin/sh
두 가지 옵션이 있습니다:/bin/sh
... 매핑 대상을 전환해도 문제가 발생하지 않도록 스크립트를 가능한 한 이식 가능하게 만듭니다 ....이식성이 없는 스크립트를 명시적으로 위치 지정올바른 통역사
/bin/sh
, 단순히 매핑을 기대하는 것이 아니라 .
/bin/sh
Bourne Shell 대신 Debian Almquist 쉘을 기본 매핑으로 만들어 해당 스크립트가예POSIX 준수(또는 더 정확하게는 Debian 정책 매뉴얼 준수)가 더 빠르게 실행됩니다.
물론 일단 현장에 들어가면 훨씬 더 멀리 갈 수 있습니다. 예를 들어 쉘 스크립트나 컴파일된 프로그램 등의 효율성 균형을 고려하십시오 /bin/true
. /usr/bin/clear
그러나 다행히도 이는 이 답변의 범위를 벗어납니다. ☺
물론, 이 중 어느 것도 새로운 것이 아니며 심지어 Unix에만 국한된 것도 아닙니다. 세기가 바뀌기 오래 전에 나는 "대화형"과 "비대화형" 특성을 모두 갖춘 명령줄 해석기를 작성하여 출시했으며, doco에서 이러한 구분을 설명하고 변수 간의 COMSPEC
환경 OS2_SHELL
차이를 기록했습니다. 마찬가지로 Debian System V에서 bashism과 패키지 설치/제거 스크립트를 제거하는 것에 대한 논의는 rc
1990년대로 거슬러 올라갑니다.
추가 읽기
- https://superuser.com/a/696310/38062
- https://unix.stackexchange.com/a/193210/5132
- 대시는
/bin/sh
. 우분투 위키. - 대시는
/bin/sh
. 데비안 위키. - 바시즘. 그렉의 위키.
- 브라이언 칼슨(2005-07-29).10.4 정책 공익광고. <[이메일 보호됨]>. 데비안 개발.
- 라파엘 가셋(2009-04-12).기본 /bin/sh로 대시를 사용하고 bashism 없이 RG를 보관합니다.. <[이메일 보호됨]>데비안-개발자.
- debian-policy: 대시 아래에서 작동하는 스크립트가 정책을 "준수"할 것이라고 언급하지 마세요.. 데비안 버그 #490604.
- goal-dash에 대한 데비안 패키지 보고서
- debian-policy: 일반적으로 echo -n 및 echo를 사용하지 마세요.. 데비안 버그 #490605.
- 레베카 소볼(2009-07-29). 두 가지 껍질 이야기: bash 또는 dash. LWN.
- 저스터스 펜들턴(1997-04-22).패키지의 bash-isms. <[이메일 보호됨]>. 데비안 개발.
- 조나단 드보인 폴라드(2000)."명령 해석기 프런트 엔드".명령 해석기 명령 참조. 32비트 명령 해석기에 대한 온라인 설명서입니다.
- 챔버스, 존(1990)./bin/true 명령 및 저작권
답변4
더 강력하고 인체공학적인 언어로 스크립트 대신 쉘 스크립트를 작성해야 하는 유일한 이유는 다음과 같습니다.알 수 없는 소프트웨어 세트가 설치된 레거시 시스템으로의 이식성은 다른 어떤 요소보다 중요합니다..
/bin/sh
이는 자신을 Unix라고 부르는 모든 사용자가 사용할 수 있는 유일한 스크립트 해석기입니다. 그러나 다수의 레거시 시스템에서 /bin/sh
관련 유틸리티는 최신 사양은 물론 POSIX.1-1996 "쉘 및 유틸리티" 사양도 준수하지 않습니다. 호환 도구는 /usr/xpg4
눈에 띄지 않는 위치에 설치되는 선택적 추가 기능입니다 . 1이식 가능한 하위 집합 쉘 언어로 스크립트를 작성하는 것은 POSIX 쉘 언어로 스크립트를 작성하는 것보다 더 지루하고 오류가 발생하기 쉽습니다. (내 말을 믿을 수 없다면 configure
Autoconf가 생성한 스크립트를 가끔 읽어 보십시오. 설정만으로도 충분히 납득할 수 있습니다.)
하지만 가정할 수 있다면다른 스크립트 인터프리터설치된 경우(예: Bash) 통역사를 사용할 수 있습니다.더 나은 스크립팅 언어설치되었습니다. 예를 들어 펄은더아마도 Bash보다 더 유용할 것입니다.
그러므로 당신은안 돼요스크립팅 #! /bin/bash
. 그것이 옵션이라면 더 나은 언어도 옵션이기 때문입니다.
1 예를 들어 Solaris 10 및 이전 버전에서는오리지널 Bourne 쉘처럼 /bin/sh
. Solaris 11에서 ksh93으로 업데이트했다는 것을 알게 되었습니다.