sh와 bash의 차이점


1303

쉘 프로그램을 작성할 때, 우리는 자주 사용 /bin/sh하고 /bin/bash. 나는 보통을 사용 bash하지만 그 차이점이 무엇인지 모르겠습니다.

간의 주요 차이점은 무엇 bashsh?

우리는에서 프로그래밍 할 때 유의해야 할 사항은 무엇 bashsh?


21
Bourne 쉘에서 작동하는 유용한 bashisms 및 해당 코드 목록은 mywiki.wooledge.org/Bashism
StackExchange saddens dancek

1
sh와 그 명령 언어에 대한 POSIX 표준 을보고 싶을 것 입니다 : * sh * Shell Command Language
Maurício C Antunes

7
일반적으로 모든 sh 스크립트는 posix 호환성 덕분에 bash에서 실행되지만 모든 bash 스크립트는 sh에서 실행할 수 없습니다. 주목할만한 차이점은 인용되지 않은 공백을 허용하는 [] 비교 대신 [[]]와 같은 것입니다. $ [] 대신 $ (()) 산술 표현식 및 bash 문서에서 직접 "너무 크고 너무 느림"과 같은 다른 것들. 그러나 새로운 스크립터는 일부를 위해 촬영하지 않는 한 sh 호환 스크립트로 제한 할 필요가 없습니다. 이전 버전과의 호환성, 요즘은 그렇지 않은 경우가 많지만 결국 2014 년이 되었습니까?
osirisgothra

답변:


1140

쉬 무엇입니까

sh(또는 Shell Command Language)는 POSIX 표준에 설명 된 프로그래밍 언어 입니다. 그것은 많은 구현이있다 ( ksh88, dash, ...). bash구현으로 간주 될 수도 있습니다 sh(아래 참조).

sh구현이 아닌 사양 이기 때문에 /bin/sh대부분의 POSIX 시스템에서 실제 구현에 대한 심볼릭 링크 (또는 하드 링크)입니다.

bash는 무엇입니까

bashsh호환 가능한 구현 으로 시작 되었지만 (POSIX 표준보다 몇 년 전부터 사용되었지만) 시간이 지남에 따라 많은 확장을 얻었습니다. 이러한 확장 중 다수는 유효한 POSIX 쉘 스크립트의 동작을 변경할 수 있으므로 그 자체로 bash는 유효한 POSIX 쉘이 아닙니다. 오히려 POSIX 쉘 언어의 방언입니다.

bash--posixPOSIX 호환 스위치를 지원 합니다. 로 호출 된 경우 POSIX를 모방하려고 시도합니다 sh.

쉬 = 배쉬?

오랫동안 대부분의 GNU / Linux 시스템 /bin/sh을 가리 /bin/bash켰습니다. 결과적으로이 둘의 차이점을 무시하는 것이 거의 안전 해졌습니다. 그러나 최근에 바뀌기 시작했습니다.

시스템의 일부 인기있는 예는 어디 /bin/sh를 가리 키지 /bin/bash(어느 일부에 /bin/bash조차 존재하지 않을 수) 있습니다 :

  1. 심볼릭 링크 현대 데비안과 우분투 시스템 shdash기본적으로;
  2. Busybox 는 일반적으로 Linux 시스템 부팅 시간의 일부로 실행됩니다 initramfs. ash쉘 구현을 사용합니다 .
  3. BSD 및 일반적으로 비 Linux 시스템. OpenBSD는 pdkshKorn 쉘의 자손 인을 사용합니다. FreeBSD sh는 원래 UNIX Bourne 쉘의 자손입니다. Solaris는 sh오랫동안 POSIX를 준수하지 않는 자체 기능 을 가지고 있습니다 . Heirloom 프로젝트 에서 무료로 구현할 수 있습니다 .

/bin/sh시스템에서 어떤 점을 지적합니까?

합병증은 /bin/sh심볼릭 링크 또는 하드 링크 일 수 있다는 것입니다. 심볼릭 링크 인 경우 이식 가능한 해결 방법은 다음과 같습니다.

% file -h /bin/sh
/bin/sh: symbolic link to bash

하드 링크 인 경우 시도하십시오

% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash

실제로이 -L플래그는 심볼릭 링크와 하드 링크를 모두 포함하지만이 방법의 단점은 이식성이 없다는 점입니다 . 비록 GNU findFreeBSD find 모두 지원 하지만 POSIX 옵션 find을 지원할 필요가 없습니다 .-samefile

셰방 라인

궁극적으로«shebang»줄을 스크립트의 첫 줄로 작성하여 어느 것을 사용할 것인지 결정하는 것은 사용자의 몫입니다.

예 :

#!/bin/sh

사용하고 sh(그리고 그 일이 발생하면)

#!/bin/bash

사용 /bin/bash가능한 경우 사용 합니다 (사용할 수없는 경우 오류 메시지와 함께 실패). 물론 다른 구현을 지정할 수도 있습니다.

#!/bin/dash

사용할 것

내 스크립트의 sh경우 다음과 같은 이유로 선호 합니다.

  • 표준화되었다
  • 훨씬 간단하고 배우기 쉽다
  • POSIX 시스템 전체에서 이식 가능 bash합니다.sh

사용 bash에도 이점이 있습니다. 이 기능은 프로그래밍을보다 편리하고 현대적인 다른 프로그래밍 언어의 프로그래밍과 유사하게 만듭니다. 여기에는 범위가 지정된 지역 변수 및 배열과 같은 것이 포함됩니다. 플레인 sh은 매우 최소한의 프로그래밍 언어입니다.


bash구문 오류가있는 경우 표시 방식으로 스크립트를 실행하면 더 유용한 오류 메시지가 표시됩니다. bash를 사용하면 시간을 절약 할 수 있습니다.
PHPst

%커맨드 라인의 시작 부분에서 무엇을 의미합니까?
JosephHarriott

@JosephHarriott 그것은 프롬프트입니다 : 당신의 명령 뒤에 쉘 자체가 인쇄 한 문자. 일부 쉘은 $대신 %또는 #루트 쉘을 사용합니다.
로마 Cheplyaka

@RomanCheplyaka 어떤 껍질? 난 단지 본 것 $하고 #...
JosephHarriott

@RomanCheplyaka 나는 shbash (bourne-again shell)을 의미하기 전에 이미 존재 했다고 확신 합니다. 그러나 매우 원시적이며 ESC문자 와 같은 터미널 이벤트에는 응답하지 않았습니다 . 그런 다음 ksh(또한 bash 앞에), bash는 더 나은 껍질의 아이디어를 좋아했지만 ksh를 싫어하는 사람들이 시작했습니다. :-)
raminr

145

sh: http://man.cx/sh
bash : http://man.cx/bash

TL; DR : 보다 세련된 구문과 기능성 bashsh갖춘 수퍼 세트입니다 . 거의 모든 경우에 bash shebang 라인을 사용하는 것이 안전합니다. 현대 플랫폼에서는 매우 보편적입니다.

주의 : 일부 환경에서는 sh 입니다 bash . 확인하십시오 sh --version.


31
bash가 sh로 호출되면 조금 다르게 동작합니다. gnu.org/software/bash/manual/bashref.html#Bash-Startup-Files ( "이름 sh로 호출") 및 gnu.org/software/bash/manual/bashref.html#Bash-POSIX-Mode를 참조하십시오 . 예를 들어, 프로세스 대체가 없습니다.
glenn jackman

11
bash는 sh의 상위 집합이며 FreeBSD와 같은 일부 OS에는 기본적으로 bash가 설치되어 있지 않으므로 sh 스크립트는 더 큰 이식성을 제공합니다.
user674062

1
특정 스크립트에 대해 POSIX 셸을 가져 오는 이식 가능한 스크립트 가능한 방법이 없으므로 이식 가능한 스크립트는 Bourne Shell 기능 이상을 사용할 수 없습니다.
schily

83

이 질문은을 사용하려고 시도 sh하는 것과 같은 행동을하지 않는 것에 대해 놀라는 사람들에게 종종 정식 명칭으로 지정 되었습니다 bash. 다음은 일반적인 오해와 함정에 대한 간단한 설명입니다.

먼저, 무엇을 기대해야하는지 이해해야합니다.

  • 당신이 스크립트를 실행하는 경우 sh scriptname, 또는 그것을 실행 scriptname하고있는 #!/bin/sh오두막 라인, 당신은 POSIX를 기대한다 sh행동을.
  • 당신이 스크립트를 실행하는 경우 bash scriptname, 또는 그것을 실행 scriptname하고있는 #!/bin/bash오두막 라인 (또는 현지 통화로 이에 상응하는 금액), 당신은 배쉬 행동을 기대한다.

올바른 shebang을 갖고 스크립트 이름 만 입력하면 ( 상대 또는 전체 경로 와 함께) 스크립트를 실행하는 것이 일반적으로 선호되는 솔루션입니다. 올바른 shebang 외에도 스크립트 파일에 실행 권한 ( chmod a+x scriptname) 이 있어야합니다 .

그렇다면 실제로 어떻게 다릅니 까?

Bash Reference 매뉴얼에는 차이점을 열거하려고 시도 하는 섹션이 있지만 일반적인 혼란의 원인은 다음과 같습니다.

  • [[에서 사용할 수 없습니다 sh( [더 성 가시고 제한적입니다).
  • sh 배열이 없습니다.
  • 일부 배쉬 키워드 좋아 local, source, function, shopt, let, declare,과 select에 이식 할 수 없습니다 sh. (일부 sh구현은 예를 들어 지원 local합니다.)
  • Bash에는 3- 인수 for((i=0;i<=3;i++))루프, +=증분 할당 등과 같은 많은 C 스타일 구문 확장 이 $'string\nwith\tC\aescapes'있습니다 .이 기능은 POSIX에서 잠정적으로 허용됩니다 (현재 Bash에서 작동하지만 sh현재에만 적용되는 시스템 에서는 아직 지원되지 않음). POSIX 사양이며 앞으로는 없을 것입니다.)
  • 배쉬 지원 <<<'here strings'.
  • 배쉬가 *.{png,jpg}{0..12}중괄호 확장.
  • ~을 의미한다 $HOME(더 일반적으로 만 배쉬에서 ~username의 홈 디렉토리에 username).이것은 POSIX에 있지만 일부 POSIX 이전 /bin/sh구현 에서 누락되었을 수 있습니다 .
  • Bash는 <(cmd)and로 프로세스를 대체 >(cmd)합니다.
  • 배쉬 같은 CSH 스타일의 편의 리디렉션 별칭이 &|대한 2>&1 |&>를 들어> ... 2>&1
  • Bash는 경로 <>재 지정 과 함께 공동 프로세스를 지원합니다 .
  • 배시 같은 비표준 확장 파라미터 확장 풍부한 기능 ${substring:1:2}, ${variable/pattern/replacement}등, 소문자 변환을
  • Bash는 쉘 산술 기능을 대폭 확장했습니다 (여전히 부동 소수점 지원은 없음). 더 이상 사용되지 않는 레거시 $[expression]구문이 있지만 POSIX 산술 $((expression))구문 으로 바꿔야 합니다. (일부 레거시 사전 POSIX sh구현에서는이를 지원하지 않을 수 있습니다.)
  • 매직 변수는 좋아 $RANDOM, $SECONDS, $PIPESTATUS[@]$FUNCNAME배쉬의 확장입니다.
  • 같은 구문의 차이 export variable=value[ "x" == "y" ](휴대용없는 export variable변수 할당, 휴대용 문자열 비교 분리되어야 [ ... ]하나의 등호 기호 사용).
  • 선택적 동작을 활성화 또는 비활성화하고 셸의 내부 상태를 노출시키는 많은 Bash 전용 확장 기능.
  • 대화식 사용을위한 많은 편의 기능이 있지만 스크립트 동작에는 영향을 미치지 않습니다.

이것은 요약 된 목록입니다. 전체 특종에 대해서는 참조 매뉴얼을 참조 하고 많은 좋은 해결 방법은 http://mywiki.wooledge.org/Bashism 을 참조하십시오 . 및 / 또는 http://shellcheck.net/ 을 시도 하여 많은 Bash 전용 기능을 경고합니다.

일반적인 오류는 #!/bin/bashshebang 줄 을 갖는 것이지만 그럼에도 불구하고 sh scriptname실제로 스크립트를 실행하는 데 사용됩니다. 이것은 기본적으로 Bash 전용 기능을 비활성화하므로 배열 사용과 같은 구문 오류가 발생합니다. shebang 행은 구문 상 주석이므로이 시나리오에서는 간단히 무시됩니다.

불행하게도 Bash는로 호출 될 때 이러한 구문을 사용하려고 할 때 경고하지 않습니다 sh. 모든 Bash 전용 기능을 완전히 비활성화하지는 않으므로 sh스크립트를 ash/ dash/ POSIX sh또는 Heirloom 과 같은 변형으로 올바르게 이식 할 수 있는지 확인하는 좋은 방법이 아니므 로 Bash를 호출하여 Bash를 실행하십시오.sh


2
기본적으로 TL; DR ersion은 And 's answer 입니다.
tripleee 2012 년

4
shellcheck.net 만 있으면됩니다. 많은 감사합니다.
Josh Habdas

FWIW export variable=value는 POSIX : pubs.opengroup.org/onlinepubs/009695399/utilities/export.html 에 의해 의무화됩니다 . 아마도 일부 고대 껍질에서는 사용할 수 없지만 분명히 bashism은 아닙니다.
로마 Cheplyaka

53

은 운영 체제 서비스에 액세스하기위한 사용자와 OS 간의 인터페이스입니다. GUI 또는 CLI (명령 줄 인터페이스) 일 수 있습니다.

(Bourne의 엘) 유닉스 / 유닉스 계열 운영 체제 쉘 명령 줄 인터프리터이다. 내장 명령을 제공합니다. 스크립팅 언어에서 인터프리터는로 표시됩니다 #!/bin/sh. 그것은 bash (free / open), kash (free가 아님)와 같은 다른 쉘에서 가장 널리 지원되는 것입니다.

Bash ( B ourne a gain s hell)는 Bourne 쉘을 대체하는 쉘입니다. Bash는 sh의 상위 집합입니다. 배쉬는 sh를 지원합니다. POSIX는 POSIX 호환 시스템의 작동 방식을 정의하는 표준 세트입니다. Bash는 실제로 POSIX 호환 쉘이 아닙니다. 스크립팅 언어에서는 인터프리터를로 표시합니다 #!/bin/bash.

유추:

  • 셸은 인터페이스 또는 사양 또는 API와 같습니다.
  • sh는 Shell 인터페이스를 구현하는 클래스입니다.
  • Bash는 sh의 하위 클래스입니다.

여기에 이미지 설명을 입력하십시오


3
나는 그것을 얻지 못한다. "Bash는 sh의 상위 집합입니다"와 "Bash는 sh의 하위 클래스입니다"라는 말을 모두 언급했습니다. 당신은 명확히 할 수 있습니까?
Keerthana Prabhakaran

11
이것이 Bash sh가 OOP 의미에서 "하위 클래스"를 상속하고 확장한다고 말하려고한다고 생각 합니다 (기능의 수퍼 세트가 있음).
tripleee

52

UNIX.COM 에서 게시

쉘 기능

아래 표는 하나의 쉘을 다른 쉘보다 선택하게 할 것이라고 생각하는 대부분의 기능을 나열합니다. 결정적인 목록이 아니며 모든 단일 쉘에 대해 가능한 모든 단일 기능을 포함하지는 않습니다. 기능은 운영 체제와 함께 제공되는 버전이거나 표준 배포에서 직접 컴파일하여 사용할 수있는 경우에만 셸에있는 것으로 간주됩니다. 특히 아래에 지정된 C 쉘은 SUNOS 4. *에서 사용할 수있는 것으로, 상당수의 공급 업체가 tcsh 또는 자체적으로 개선 된 C 쉘을 대신 배송합니다 (항상 tcsh를 배송하고 있음을 항상 밝히지는 않습니다).

암호:

                                     sh   csh  ksh  bash tcsh zsh  rc   es
Job control                          N    Y    Y    Y    Y    Y    N    N
Aliases                              N    Y    Y    Y    Y    Y    N    N
Shell functions                      Y(1) N    Y    Y    N    Y    Y    Y
"Sensible" Input/Output redirection  Y    N    Y    Y    N    Y    Y    Y
Directory stack                      N    Y    Y    Y    Y    Y    F    F
Command history                      N    Y    Y    Y    Y    Y    L    L
Command line editing                 N    N    Y    Y    Y    Y    L    L
Vi Command line editing              N    N    Y    Y    Y(3) Y    L    L
Emacs Command line editing           N    N    Y    Y    Y    Y    L    L
Rebindable Command line editing      N    N    N    Y    Y    Y    L    L
User name look up                    N    Y    Y    Y    Y    Y    L    L
Login/Logout watching                N    N    N    N    Y    Y    F    F
Filename completion                  N    Y(1) Y    Y    Y    Y    L    L
Username completion                  N    Y(2) Y    Y    Y    Y    L    L
Hostname completion                  N    Y(2) Y    Y    Y    Y    L    L
History completion                   N    N    N    Y    Y    Y    L    L
Fully programmable Completion        N    N    N    N    Y    Y    N    N
Mh Mailbox completion                N    N    N    N(4) N(6) N(6) N    N
Co Processes                         N    N    Y    N    N    Y    N    N
Builtin artithmetic evaluation       N    Y    Y    Y    Y    Y    N    N
Can follow symbolic links invisibly  N    N    Y    Y    Y    Y    N    N
Periodic command execution           N    N    N    N    Y    Y    N    N
Custom Prompt (easily)               N    N    Y    Y    Y    Y    Y    Y
Sun Keyboard Hack                    N    N    N    N    N    Y    N    N
Spelling Correction                  N    N    N    N    Y    Y    N    N
Process Substitution                 N    N    N    Y(2) N    Y    Y    Y
Underlying Syntax                    sh   csh  sh   sh   csh  sh   rc   rc
Freely Available                     N    N    N(5) Y    Y    Y    Y    Y
Checks Mailbox                       N    Y    Y    Y    Y    Y    F    F
Tty Sanity Checking                  N    N    N    N    Y    Y    N    N
Can cope with large argument lists   Y    N    Y    Y    Y    Y    Y    Y
Has non-interactive startup file     N    Y    Y(7) Y(7) Y    Y    N    N
Has non-login startup file           N    Y    Y(7) Y    Y    Y    N    N
Can avoid user startup files         N    Y    N    Y    N    Y    Y    Y
Can specify startup file             N    N    Y    Y    N    N    N    N
Low level command redefinition       N    N    N    N    N    N    N    Y
Has anonymous functions              N    N    N    N    N    N    Y    Y
List Variables                       N    Y    Y    N    Y    Y    Y    Y
Full signal trap handling            Y    N    Y    Y    N    Y    Y    Y
File no clobber ability              N    Y    Y    Y    Y    Y    N    F
Local variables                      N    N    Y    Y    N    Y    Y    Y
Lexically scoped variables           N    N    N    N    N    N    N    Y
Exceptions                           N    N    N    N    N    N    N    Y

위 표의 열쇠입니다.

Y이 쉘을 사용하여 기능을 수행 할 수 있습니다.

N 쉘에 기능이 없습니다.

F 쉘 기능 메커니즘을 사용해야 만 기능을 수행 할 수 있습니다.

L이 기능을 활성화하려면 리드 라인 라이브러리가 셸에 연결되어 있어야합니다.

위의 표에 대한 참고 사항

1. This feature was not in the original version, but has since become
   almost standard.
2. This feature is fairly new and so is often not found on many
   versions of the shell, it is gradually making its way into
   standard distribution.
3. The Vi emulation of this shell is thought by many to be
   incomplete.
4. This feature is not standard but unofficial patches exist to
   perform this.
5. A version called 'pdksh' is freely available, but does not have
   the full functionality of the AT&T version.
6. This can be done via the shells programmable completion mechanism.
7. Only by specifying a file via the ENV environment variable.

Bourne Shell의 기능과 1988 년 이전의 ksh의 기능을 비교하려고 할 때 테이블이 유용하지 않습니다. 1988에 대한 테이블을 실제로 만들려면 bash를 포함하여 테이블에서 다른 쉘을 대부분 제거해야합니다. , sh 및 rc. 테이블의 값을 어디서 얻었는지 설명 할 수 있습니까?
schily

1
1989 년 Bourne Shell에 Job Control이 추가되었고 2005 년에 Bourne Shell이 ​​OpenSource로 변경되었습니다. Korn 쉘은 1988 년 이후로 프로세스 대체를했으며 1997 년 이후 OpenSource입니다. BTW : $ ENV 관련 진술 맞지 않습니다. $ ENV는 대화식 쉘에 대해서만 읽기 / 실행됩니다.
schily


@schily 어디에서나 잘못되었다고 생각되면 자유롭게 편집하십시오.
SriniV

8
Schily가 노출 한 내용에 따라이 답변은 본질적으로 사기성이기 때문에이 답변을 제거하는 것이 더 좋을 것으로 보이며 OP는 붙여 넣은 정보를 실제로 조사하지 않았습니다.
danno

24

단말기

  • 창을 올리는 프로그램
  • xterm, rxvt, konsole, kvt, gnome-terminal, nxterm 및 eterm.

껍질

  • 터미널에서 실행되는 프로그램입니다
  • 쉘은 명령 해석기 및 프로그래밍 언어입니다
  • 쉘은 단순히 명령을 실행하는 매크로 프로세서입니다.
  • 매크로 프로세서는 텍스트와 기호를 확장하여 더 큰 표현을 만드는 기능을 의미합니다.

SH 대 세게 때리다

SH

  • (껍질)
  • 특정 껍질인가
  • 명령 해석기 및 프로그래밍 언어
  • BASH의 전신

세게 때리다

  • (Bourne-Again SHell)
  • 특정 껍질인가
  • 명령 해석기 및 프로그래밍 언어
  • sh 기능 등
  • SH의 후임
  • BASH는 기본 SHELL입니다

참고 자료:

gnu.org :

기본적으로 쉘은 단순히 명령을 실행 하는 매크로 프로세서 입니다. 매크로 프로세서 라는 용어 는 텍스트와 기호를 확장하여 더 큰 표현을 만드는 기능을 의미합니다.

유닉스 쉘은 명령 해석기 및 프로그래밍 언어입니다. 명령 인터프리터로서 쉘은 풍부한 GNU 유틸리티 세트에 사용자 인터페이스를 제공합니다. 프로그래밍 언어 기능을 통해 이러한 유틸리티를 결합 할 수 있습니다. 명령이 포함 된 파일을 작성하고 명령 자체가 될 수 있습니다. 이러한 새 명령은 / bin과 같은 디렉토리의 시스템 명령과 상태가 동일하므로 사용자 또는 그룹이 사용자 정의 환경을 설정하여 공통 작업을 자동화 할 수 있습니다.

쉘은 대화식 또는 비 대화식으로 사용될 수 있습니다. 대화식 모드에서는 키보드에서 입력 된 입력을 수락합니다. 비 대화식으로 실행할 때, 쉘은 파일에서 읽은 명령을 실행합니다.

쉘은 GNU 명령을 동기식 및 비동기식으로 실행할 수 있습니다. 쉘은 추가 입력을 승인하기 전에 동기 명령이 완료되기를 기다립니다. 비동기 명령은 추가 명령을 읽고 실행하는 동안 쉘과 병렬로 계속 실행됩니다. 리디렉션 구성을 통해 해당 명령의 입력 및 출력을 세밀하게 제어 할 수 있습니다. 또한 쉘은 명령 환경의 내용을 제어 할 수 있습니다.

쉘은 또한 별도의 유틸리티를 통해 얻을 수 없거나 불편한 기능을 구현하는 작은 내장 명령 세트 (내장)를 제공합니다 . 예를 들어, cd, break, continue 및 exec는 쉘 자체를 직접 조작하므로 쉘 외부에서 구현할 수 없습니다 . 히스토리, getopts, kill 또는 pwd 내장은 별도의 유틸리티로 구현 될 수 있지만 내장 명령으로 사용하는 것이 더 편리합니다. 모든 셸 내장은 다음 섹션에서 설명합니다.

명령을 실행하는 것이 필수적이지만 쉘의 강력한 기능 (및 복잡성)은 내장 된 프로그래밍 언어로 인한 것입니다. 다른 고급 언어와 마찬가지로 쉘은 변수, 흐름 제어 구문, 인용 및 기능을 제공합니다.

쉘은 프로그래밍 언어를 향상시키기보다는 대화식으로 사용하도록 특별히 설계된 기능을 제공합니다. 이러한 대화식 기능에는 작업 제어, 명령 행 편집, 명령 히스토리 및 별명이 포함됩니다. 이러한 각 기능은이 매뉴얼에 설명되어 있습니다.

배쉬 gnu.org :

Bash는 GNU 운영 체제의 쉘 또는 명령 언어 인터프리터입니다. 이 이름은 유닉스의 7th Edition Bell Labs Research 버전에 나타난 현재 유닉스 쉘 sh의 조상 인 스티븐 본의 말장난 '본-아게 인 SH'(Bourne-Again SHell)의 약자입니다.

Bash는 sh와 거의 호환되며 Korn 쉘 ksh 및 C 쉘 csh의 유용한 기능을 통합합니다. IEEE POSIX 사양 (IEEE 표준 1003.1)의 IEEE POSIX 셸 및 도구 부분을 준수하도록 구현되었습니다. 대화식 및 프로그래밍 용도 모두 sh보다 기능이 향상되었습니다.

GNU 운영 체제는 csh 버전을 포함하여 다른 쉘을 제공하지만 Bash는 기본 쉘 입니다. 다른 GNU 소프트웨어와 마찬가지로 Bash는 이식성이 뛰어납니다. 현재 거의 모든 버전의 Unix 및 기타 운영 체제에서 실행됩니다. MS-DOS, OS / 2 및 Windows 플랫폼에 대해 독립적으로 지원되는 포트가 있습니다.


14

다른 답변은 일반적으로 Bash와 POSIX 쉘 표준의 차이점을 지적했습니다. 그러나 이식 가능한 쉘 스크립트를 작성하고 Bash 구문에 사용되는 경우 일반적인 bashism 및 해당 순수 POSIX 솔루션 목록이 매우 편리합니다. 이러한 목록은 우분투가 Bash에서 Dash로 기본 시스템 쉘로 전환했을 때 컴파일되었으며 여기에서 찾을 수 있습니다 : https://wiki.ubuntu.com/DashAsBinSh

또한 스크립트에서 bashism 을 검사하는 checkbashisms 라는 훌륭한 도구가 있으며 스크립트를 이식 가능하게 만들 때 편리합니다.


이것은 기본적으로 지금 당장 나의 대답이 진정으로 요약되는 것입니다. +1
tripleee

7

그들은 거의 동일입니다하지만 bash더 많은 기능을 가지고 - sh(다소)는 이전 부분 집합을 bash.

shBourne shellbash( Bourne *again* shell) 이전 의 원본을 의미하며 1977 년에 만들어졌습니다. 그러나 실제로는 1992 년부터 POSIX 표준을 준수하는 호환성이 뛰어난 셸로 생각하는 것이 좋습니다.

쉘로 시작 #!/bin/sh하거나 sh쉘을 사용하는 스크립트는 일반적으로 이전 버전과의 호환성을 위해 그렇게합니다. 유닉스 / 리눅스 OS에는 sh쉘이 있습니다. 우분투 sh에서는 종종 호출 dash하고 MacOS에서는 특별한 POSIX 버전입니다 bash. 이러한 쉘은 표준 호환 동작, 속도 또는 이전 버전과의 호환성을 위해 선호 될 수 있습니다.

bash원본보다 최신이며 sh, 더 많은 기능을 추가하고 이전 버전과 호환되도록 sh합니다. 이론적으로 sh프로그램은에서 실행해야합니다 bash. bash거의 모든 리눅스 / 유닉스 머신에서 사용할 수 있으며, 기본적 zsh으로 Catalina (10.15) 를 기준 으로하는 MacOS를 제외하고는 기본적으로 사용됩니다 . FreeBSD는 기본적으로 bash설치되어 있지 않습니다 .


shPOSIX보다 훨씬 이전 버전입니다. 요즘에는 shPOSIX와 호환되는 제품 을 원할 것입니다 . 그러나 레거시 시스템에서 이것은 결코 주어진 것이 아닙니다. POSIX는 쉘보다 훨씬 더 정체되어 있습니다. 실제로 운영 체제 호출 및 라이브러리 기능의 표준화가 더 중요하다고 주장 할 수 있습니다.
tripleee

혼동을 줄 이도록 POSIX에 대한 내용을 제거했습니다.
Ryan Taylor

3

/bin/sh와 같은 프로그램을 호출하거나 호출하지 않을 수 있습니다 /bin/bash.

shPOSIX에 필요한 기능 을 적어도 지원합니다 (올바른 구현 가정). 확장 기능도 지원할 수 있습니다.

bash"Bourne Again Shell"은 sh 및 bash 별 확장에 필요한 기능을 구현합니다. 전체 확장 세트가 여기에 설명하기에는 너무 길며 새 릴리스에 따라 다릅니다. 차이점은 bash 매뉴얼에 문서화되어 있습니다. info bash"배시 기능"섹션 (현재 버전의 섹션 6)을 입력 하고 읽거나 현재 문서를 온라인으로 읽으십시오 .


shPATH현재 쉘에 올바른 설정 이있는 경우 POSIX 쉘만 제공합니다 . POSIX 쉘을 제공하는 정의 된 PATH 이름이 없습니다.
schily

예를 들어 오랫동안 솔라리스에서 POSIX 쉘을 제공 할 sh필요 조차 없었습니다 .
tripleee

3

bash와 sh는 서로 다른 쉘입니다. 기본적으로 bash는 더 많은 기능과 더 나은 구문으로 제공됩니다. 대부분의 명령은 동일하게 작동하지만 서로 다릅니다. Bash (bash)는 가장 많이 사용되는 유닉스 쉘 중 하나입니다. Bash는 "Bourne Again SHell"의 약자이며 원래 Bourne 쉘 (sh)의 교체 / 개선입니다.

셸 스크립팅은 모든 셸에서 스크립팅하는 반면 Bash 스크립팅은 Bash 전용 스크립팅입니다. 그러나 실제로 "shell script"와 "bash script"는 문제의 쉘이 Bash가 아닌 한 상호 교환 적으로 사용되는 경우가 많습니다.

대부분의 시스템에서 / bin / sh는 심볼릭 링크이며 sh를 호출하지 않습니다. 우분투에서 / bin / sh는 리눅스 배포판에서 일반적인 동작 인 bash에 연결하는 데 사용되었지만 이제는 대시라는 다른 쉘로의 연결로 변경되었습니다. bash는 표준 (또는 적어도 내 경험으로는 가장 일반적)이므로 bash를 사용합니다. 사실, bash 스크립트가 #! / bin / sh를 사용할 때 문제가 발생합니다. 왜냐하면 스크립트 제작자는 링크가 필요 없을 때 bash에 대한 링크라고 가정하기 때문입니다.


0

가능한 쉽게 차이점 : 기본 이해를 마친 후에는 위에 게시 된 다른 의견을 쉽게 파악할 수 있습니다.

- "쉘"은 사용자와 운영 체제 (커널) 간의 상호 작용을 용이하게하는 프로그램입니다. sh, bash, csh, zsh 등의 많은 쉘 구현이 있습니다.

쉘 프로그램을 사용하면 해당 쉘 프로그램에서 지원하는 명령을 실행할 수 있습니다.

배시 - 그것은 유래의 B ourne- 이득 되겠습니까. 이 프로그램을 사용하면 Shell에서 지정한 모든 명령을 실행할 수 있습니다. 또한이 프로그램에 특별히 추가 된 일부 명령을 실행할 수 있습니다. Bash는 sh와 역 호환됩니다.

Sh-Bourne Shell 에서 파생되었습니다 . "sh"는 쉘에 지정된 모든 명령을 지원합니다. 의미,이 프로그램을 사용하면 Shell에서 지정한 모든 명령을 실행할 수 있습니다.

자세한 내용을 보려면 다음을 수행하십시오. - https : //man.cx/sh-https : //man.cx/bash


POSIX를 이해하려면 Alex 의 답변을 확인하십시오. stackoverflow.com/a/1780614/1261003
Raihanhbh

POSIX를 이해하려고하지 않습니다. 귀하의 답변을 검토 중이므로 귀하의 답변이 가치를 더하는 것을 확인해야합니다. 나는 그렇게 생각하지 않습니다.
Scratte

나는 이러한 작은 설명이 초보자가 위의 토론에서 사용 된 전문 용어를 더 편안하게 이해하는 데 도움이 될 것이라고 믿습니다. @Scratte
Raihanhbh

-1

Linux 운영 체제는 다양한 유형의 쉘을 제공합니다. 쉘에는 공통된 명령이 많이 있지만 각 유형마다 고유 한 기능이 있습니다. 주로 사용되는 다른 종류의 껍질을 연구합시다.

쉬 쉘 :

Sh 쉘은 Bourne Shell이라고도합니다. Sh 쉘은 1977 년 AT & T의 Bell Labs에서 Stephen Bourne이 Unix 컴퓨터 용으로 개발 한 첫 번째 쉘입니다. 여기에는 많은 스크립팅 도구가 포함되어 있습니다.

배쉬 쉘 :

Bash shell은 Bourne Again Shell의 약자입니다. Bash 쉘은 대부분의 Linux 배포에서 기본 쉘이며 Sh 쉘을 대체합니다 (Sh 쉘은 Bash 쉘에서도 실행됩니다). Bash Shell은 대부분의 Sh 쉘 스크립트를 수정하지 않고 실행할 수 있으며 명령 줄 편집 기능도 제공합니다.


켄 톰슨 (Ken Thompson)의 이전 껍질이있었습니다. Bourne 쉘은 공식적으로 v7 Unix (1979)에 도입되었습니다.
tripleee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.