쉘 프로그램을 작성할 때 /bin/sh
및 /bin/bash
자주 사용합니다. 나는 보통 bash
사용하지만 그들 사이의 차이점이 무엇인지 모르겠습니다.
bash
와 sh
의 주요 차이점은 무엇입니까?
bash
와 sh
프로그래밍할 때 알아야 할 사항은 무엇입니까?
질문자 :Weiwei Yang
쉘 프로그램을 작성할 때 /bin/sh
및 /bin/bash
자주 사용합니다. 나는 보통 bash
사용하지만 그들 사이의 차이점이 무엇인지 모르겠습니다.
bash
와 sh
의 주요 차이점은 무엇입니까?
bash
와 sh
프로그래밍할 때 알아야 할 사항은 무엇입니까?
sh
(또는 Shell Command Language)는POSIX 표준에서 설명하는 프로그래밍 언어입니다. 많은 구현이 있습니다( ksh88
, dash
, ...). bash
sh
의 구현으로 간주될 수도 있습니다(아래 참조).
sh
는 구현이 아니라 사양이기 때문에 /bin/sh
는 대부분의 POSIX 시스템에서 실제 구현에 대한 심볼릭 링크(또는 하드 링크)입니다.
bash
sh
호환 구현으로 시작했지만(POSIX 표준보다 몇 년 앞서긴 했지만) 시간이 지남에 따라 많은 확장을 얻었습니다. 이러한 확장의 대부분은 유효한 POSIX 셸 스크립트의 동작을 변경할 수 있으므로 bash
자체는 유효한 POSIX 셸이 아닙니다. 오히려 POSIX 쉘 언어의 방언입니다.
bash
--posix
스위치를 지원하므로 POSIX와 더 호환됩니다. sh
호출되는 경우 POSIX를 모방하려고 시도합니다.
오랫동안 /bin/sh
는 대부분의 GNU/Linux 시스템에서 /bin/bash
를 가리키는 데 사용되었습니다. 결과적으로 둘의 차이를 무시하는 것이 거의 안전해졌습니다. 그러나 최근에 바뀌기 시작했습니다.
/bin/sh
/bin/bash
가리키지 않고 /bin/bash
가 존재하지 않을 수도 있는 시스템의 몇 가지 인기 있는 예는 다음과 같습니다.
sh
를 dash
로 심볼릭 링크하는 최신 데비안 및 우분투 시스템.initramfs
일부로 Linux 시스템 부팅 시 실행되는 Busybox . ash
쉘 구현을 사용합니다.pdksh
FreeBSD의 sh
는 원래 UNIX Bourne 쉘의 후손입니다. Solaris에는 오랫동안 POSIX와 호환되지 않는 sh
무료 구현은 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 find 와 FreeBSD find가 모두 -samefile
옵션을 지원하기 위해 find
를 요구하지 않습니다.
궁극적으로 스크립트의 맨 처음 줄에 «shebang» 줄을 작성하여 사용할 것을 결정하는 것은 사용자의 몫입니다.
예
#!/bin/sh
sh
(그리고 그것이 가리키는 모든 것)를 사용할 것입니다.
#!/bin/bash
/bin/bash
를 사용하고 그렇지 않은 경우 오류 메시지와 함께 실패합니다. 물론 다른 구현을 지정할 수도 있습니다.
#!/bin/dash
내 스크립트의 경우 다음과 같은 이유로 sh
bash
sh
가 있어야 합니다. bash
를 사용하는 것에도 장점이 있습니다. 그 기능은 프로그래밍을 더 편리하고 다른 현대 프로그래밍 언어로 프로그래밍하는 것과 유사합니다. 여기에는 범위가 지정된 지역 변수 및 배열과 같은 항목이 포함됩니다. Plain sh
는 매우 최소한의 프로그래밍 언어입니다.
sh
: http://man.cx/sh
bash
: http://man.cx/bash
TL;DR : bash
는 더 우아한 구문과 더 많은 기능을 가진 sh
의 상위 집합입니다. bash shebang 라인은 현대 플랫폼에서 매우 보편적이기 때문에 거의 모든 경우에 사용하는 것이 안전합니다.
주의: 일부 환경에서는 sh
가 bash
입니다. sh --version
확인하십시오.
sh
bash
와 동일하게 동작하지 않는다는 사실에 놀란 사람들을 위한 표준으로 자주 지정되었습니다. 다음은 일반적인 오해와 함정에 대한 간략한 요약입니다.
먼저 무엇을 기대해야 하는지 이해해야 합니다.
sh scriptname
, 또는 그것을 실행 scriptname
하고 있습니다 #!/bin/sh
에서 오두막의 라인을, 당신은 POSIX의 예상해야 sh
동작을.bash scriptname
, 또는 그것을 실행 scriptname
하고 있습니다 #!/bin/bash
오두막 라인 (또는 현지 통화로 이에 상응하는 금액), 당신은 배쉬 행동을 기대한다. 올바른 shebang이 있고 스크립트 이름( 상대 경로 또는 전체 경로 포함 )만 입력하여 스크립트를 실행하는 것이 일반적으로 선호되는 솔루션입니다. 올바른 shebang에 추가하여 스크립트 파일에 실행 권한( chmod a+x scriptname
)이 있어야 합니다.
그렇다면 실제로 어떻게 다른가요?
Bash 참조 설명서에는 차이점을 열거 하는 섹션이 있지만 몇 가지 일반적인 혼동 소스는 다음과 같습니다.
[[
sh
에서 사용할 수 없습니다(더 투박하고 제한적인 [
Bash에서 단일 대괄호와 이중 대괄호의 차이점 도 참조하십시오.sh
에는 배열이 없습니다.local
, source
, function
, shopt
, let
, declare
및 select
에 이식 할 수 없습니다 sh
. (일부 sh
구현은 예를 들어 local
지원합니다.)for((i=0;i<=3;i++))
루프, +=
증분 할당 등과 같은 많은 C 스타일 구문 확장 $'string\nwith\tC\aescapes'
기능은 다음과 같습니다. POSIX에 대해 잠정적으로 허용됩니다(지금은 Bash에서 작동하지만 현재 POSIX 사양만 준수하는 시스템에서는 sh
<<<'here strings'
지원합니다.*.{png,jpg}
및 {0..12}
중괄호 확장이 있습니다.~
$HOME
참조합니다(더 일반적으로 ~username
username
의 홈 디렉토리)./bin/sh
구현에서는 누락될 수 있습니다.<(cmd)
및 >(cmd)
프로세스 대체가 있습니다.&|
와 같은 Csh 스타일의 편리한 리디렉션 별칭이 있습니다. 2>&1 |
및 &>
for > ... 2>&1
<>
리디렉션이 있는 코프로세스를 지원합니다.${substring:1:2}
, ${variable/pattern/replacement}
, 대소문자 변환 등과 같은 확장된 비표준 매개변수 확장의 풍부한 세트를 제공합니다.$[expression]
구문이 있지만 POSIX 산술 $((expression))
구문으로 대체되어야 합니다. (일부 레거시 pre-POSIX sh
구현은 이를 지원하지 않을 수 있습니다.)type -a
, printf -v
및 다년생 echo -e
와 같이 이식할 수 없는 옵션이 있습니다.$RANDOM
, $SECONDS
, $PIPESTATUS[@]
및 $FUNCNAME
과 같은 매직 변수는 Bash 확장입니다.export variable=value
및 [ "x" == "y" ]
와 같은 구문상의 차이점 export variable
는 변수 할당과 분리되어야 하고 [ ... ]
이식 가능한 문자열 비교는 단일 등호를 사용합니다).이것은 요약된 목록임을 기억하십시오. 전체 특종에 대해서는 참조 매뉴얼을 참조하고 많은 좋은 해결 방법에 대해서는 http://mywiki.wooledge.org/Bashism을 참조하십시오. 및/또는 많은 Bash 전용 기능에 대해 경고하는 http://shellcheck.net/을 시도하십시오.
일반적인 오류는 #!/bin/bash
shebang 행이 있지만 그럼에도 불구하고 실제로 스크립트를 실행하기 위해 sh scriptname
이것은 기본적으로 모든 Bash 전용 기능을 비활성화하므로 배열을 사용하려고 할 때 구문 오류가 발생합니다. (shebang 라인은 구문상 주석이므로 이 시나리오에서는 단순히 무시됩니다.)
sh
로 호출될 때 이러한 구성을 사용하려고 할 때 경고하지 않습니다. 모든 Bash 전용 기능을 완전히 비활성화하지도 않으므로 sh
로 호출하여 Bash를 실행하는 것은 ash
/ dash
/POSIX sh
또는 Heirloom sh
와 같은 변형으로 제대로 이식 가능한지 확인하는 좋은 방법이 아닙니다.
셸 은 운영 체제의 서비스에 액세스하기 위한 사용자와 OS 간의 인터페이스입니다. GUI 또는 CLI(명령줄 인터페이스)일 수 있습니다.
sh (Bourne sh ell)는 Unix/Unix 계열 운영 체제용 쉘 명령줄 인터프리터입니다. 몇 가지 기본 제공 명령을 제공합니다. 스크립팅 언어에서 우리는 인터프리터를 #!/bin/sh
로 나타냅니다. bash(무료/공개), kash(무료가 아님)와 같은 다른 쉘에서 가장 널리 지원되는 것 중 하나였습니다.
배시 (게인의 대체 ourne B)는 본 셸 용 쉘 여분이다. Bash는 sh의 상위 집합입니다. Bash는 sh를 지원합니다. POSIX는 POSIX 호환 시스템이 작동하는 방식을 정의하는 일련의 표준입니다. Bash는 실제로 POSIX 호환 쉘이 아닙니다. 스크립팅 언어에서 우리는 인터프리터를 #!/bin/bash
로 나타냅니다.
유추:
UNIX.COM 에서 게시
쉘 기능
아래 표에는 다른 쉘보다 하나의 쉘을 선택하게 만드는 대부분의 기능이 나열되어 있습니다. 이 목록은 최종 목록이 아니며 가능한 모든 단일 셸에 대해 가능한 모든 기능을 포함하지 않습니다. 기능은 운영 체제와 함께 제공되는 버전에 있거나 표준 배포판에서 직접 컴파일된 대로 사용할 수 있는 경우에만 셸에 있는 것으로 간주됩니다. 특히 아래에 지정된 C 셸은 SUNOS 4.*에서 사용할 수 있는 것입니다. 이제 상당한 수의 공급업체에서 tcsh 또는 자체 향상된 C 셸을 대신 제공합니다(tcsh를 제공한다는 사실을 항상 분명히 하지는 않습니다.
암호:
sh csh ksh bash tcsh zsh rc es Job control NYYYYYNN Aliases NYYYYYNN Shell functions Y(1) NYYNYYY "Sensible" Input/Output redirection YNYYNYYY Directory stack NYYYYYFF Command history NYYYYYLL Command line editing NNYYYYLL Vi Command line editing NNYYY(3) YLL Emacs Command line editing NNYYYYLL Rebindable Command line editing NNNYYYLL User name look up NYYYYYLL Login/Logout watching NNNNYYFF Filename completion NY(1) YYYYLL Username completion NY(2) YYYYLL Hostname completion NY(2) YYYYLL History completion NNNYYYLL Fully programmable Completion NNNNYYNN Mh Mailbox completion NNNN(4) N(6) N(6) NN Co Processes NNYNNYNN Builtin artithmetic evaluation NYYYYYNN Can follow symbolic links invisibly NNYYYYNN Periodic command execution NNNNYYNN Custom Prompt (easily) NNYYYYYY Sun Keyboard Hack NNNNNYNN Spelling Correction NNNNYYNN Process Substitution NNNY(2) NYYY Underlying Syntax sh csh sh sh csh sh rc rc Freely Available NNN(5) YYYYY Checks Mailbox NYYYYYFF Tty Sanity Checking NNNNYYNN Can cope with large argument lists YNYYYYYY Has non-interactive startup file NYY(7) Y(7) YYNN Has non-login startup file NYY(7) YYYNN Can avoid user startup files NYNYNYYY Can specify startup file NNYYNNNN Low level command redefinition NNNNNNNY Has anonymous functions NNNNNNYY List Variables NYYNYYYY Full signal trap handling YNYYNYYY File no clobber ability NYYYYYNF Local variables NNYYNYYY Lexically scoped variables NNNNNNNY Exceptions NNNNNNNY
위 표의 키입니다.
Y 기능은 이 쉘을 사용하여 수행할 수 있습니다.
N 기능이 쉘에 없습니다.
F 기능은 shells 기능 메커니즘을 사용해야만 수행할 수 있습니다.
L 이 기능을 활성화하려면 readline 라이브러리를 셸에 연결해야 합니다.
위 표 참고
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.
단말기
껍데기
SH 대. 세게 때리다
쉿
세게 때리다
참고 자료:
쉘 gnu.org:
기본적으로 쉘은 명령을 실행 하는 매크로 프로세서입니다. 매크로 프로세서라는 용어 는 텍스트와 기호를 확장하여 더 큰 표현을 만드는 기능을 의미합니다.
Unix 쉘은 명령 인터프리터이자 프로그래밍 언어입니다. 명령 인터프리터로서 쉘은 풍부한 GNU 유틸리티 세트에 대한 사용자 인터페이스를 제공합니다. 프로그래밍 언어 기능을 통해 이러한 유틸리티를 결합할 수 있습니다. 명령을 포함하는 파일을 생성하고 명령 자체가 될 수 있습니다. 이러한 새 명령은 /bin과 같은 디렉토리의 시스템 명령과 동일한 상태를 가지므로 사용자 또는 그룹이 사용자 지정 환경을 설정하여 공통 작업을 자동화할 수 있습니다.
쉘은 대화식으로 또는 비대화식으로 사용할 수 있습니다. 대화형 모드에서는 키보드에서 입력한 입력을 받아들입니다. 비대화식으로 실행할 때 셸은 파일에서 읽은 명령을 실행합니다.
셸을 사용하면 동기 및 비동기로 GNU 명령을 실행할 수 있습니다. 쉘은 추가 입력을 받기 전에 동기 명령이 완료될 때까지 기다립니다. 비동기 명령은 추가 명령을 읽고 실행하는 동안 쉘과 병렬로 계속 실행됩니다. 리디렉션 구성을 사용하면 해당 명령의 입력 및 출력을 세밀하게 제어할 수 있습니다. 더욱이 쉘은 명령 환경의 내용을 제어할 수 있습니다.
쉘은 또한 별도의 유틸리티를 통해 얻을 수 없거나 불편한 기능을 구현하는 작은 내장 명령(내장) 세트를 제공합니다 . 예를 들어 cd, break, continue 및 exec는 쉘 자체를 직접 조작하기 때문에 쉘 외부에서 구현할 수 없습니다. history, getopts, kill, pwd 내장 기능 등은 별도의 유틸리티로 구현할 수 있지만 내장 명령으로 사용하는 것이 더 편리합니다. 모든 쉘 내장 기능은 다음 섹션에서 설명합니다.
명령을 실행하는 것이 필수적이지만 셸의 기능(및 복잡성)의 대부분은 포함된 프로그래밍 언어 때문입니다. 다른 고급 언어와 마찬가지로 셸은 변수, 흐름 제어 구성, 인용 및 기능을 제공합니다.
쉘은 프로그래밍 언어를 보강하기 보다는 대화식 사용을 위해 특별히 설계된 기능을 제공합니다. 이러한 대화형 기능에는 작업 제어, 명령줄 편집, 명령 기록 및 별칭이 포함됩니다. 이러한 각 기능은 이 설명서에 설명되어 있습니다.
BASH gnu.org:
Bash는 GNU 운영 체제용 쉘 또는 명령 언어 인터프리터입니다. 이름은 'Bourne-Again SHell'의 약자이며, 현재 Unix Shell sh의 직계 조상인 Stephen Bourne의 말장난으로, Bell Labs Research 버전의 Unix 7판에 등장했습니다.
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 플랫폼에 대해 독립적으로 지원되는 포트가 있습니다.
다른 답변은 일반적으로 Bash와 POSIX 셸 표준의 차이점을 지적했습니다. 그러나 이식 가능한 셸 스크립트를 작성하고 Bash 구문에 사용할 때 일반적인 bashism 및 해당하는 순수 POSIX 솔루션 목록이 매우 편리합니다. 이러한 목록은 Ubuntu가 기본 시스템 셸로 Bash에서 Dash로 전환할 때 컴파일되었으며 여기에서 찾을 수 있습니다. https://wiki.ubuntu.com/DashAsBinSh
또한 스크립트에서 bashism 을 확인하고 스크립트가 이식 가능한지 확인하려는 경우 편리하게 사용할 수 있는 checkbashism이라는 훌륭한 도구가 있습니다.
bash와 sh는 서로 다른 쉘입니다. 기본적으로 bash는 더 많은 기능과 더 나은 구문을 가진 sh입니다. 대부분의 명령은 동일하게 작동하지만 다릅니다. Bash(bash)는 사용 가능한(그러나 가장 일반적으로 사용되는) Unix 셸 중 하나입니다. Bash는 "Bourne Again SHell"의 약자이며 원래 Bourne 셸(sh)을 대체/개선한 것입니다.
셸 스크립팅은 모든 셸에서 스크립팅하는 반면 Bash 스크립팅은 Bash용으로 특별히 스크립팅합니다. 그러나 실제로 "쉘 스크립트"와 "bash 스크립트"는 문제의 쉘이 Bash가 아닌 경우를 제외하고 종종 같은 의미로 사용됩니다.
하지만 대부분의 시스템에서 /bin/sh는 심볼릭 링크이며 sh를 호출하지 않는다는 것을 알아야 합니다. Ubuntu에서 /bin/sh는 Linux 배포판의 일반적인 동작인 bash에 연결하는 데 사용되었지만 이제는 dash라는 다른 셸에 연결하도록 변경되었습니다. 나는 bash가 거의 표준이기 때문에 (또는 적어도 내 경험에 따르면 가장 일반적이기 때문에) bash를 사용할 것입니다. 사실, bash 스크립트가 #!/bin/sh를 사용할 때 문제가 발생합니다. 왜냐하면 스크립트 제작자는 링크가 그럴 필요가 없을 때 bash에 대한 링크라고 가정하기 때문입니다.
그것들은 거의 동일하지만 bash
에는 더 많은 기능이 있습니다 . sh
bash
의 더 오래된 하위 집합입니다.
sh
bash
( Bourne *again* shell
) 이전의 원래 Bourne shell
의미하며 1977년에 만들어졌습니다. 그러나 실제로는 POSIX와 호환되는 고도로 교차 호환되는 셸로 생각하는 것이 더 나을 수 있습니다. 1992년부터 표준.
#!/bin/sh
sh
쉘을 사용하는 스크립트는 일반적으로 이전 버전과의 호환성을 위해 그렇게 합니다. 모든 유닉스/리눅스 OS에는 sh
쉘이 있습니다. Ubuntu에서 sh
종종 dash
bash
의 특별한 POSIX 버전입니다. 이러한 셸은 표준 준수 동작, 속도 또는 이전 버전과의 호환성을 위해 선호될 수 있습니다.
bash
sh
보다 최신 버전이며 더 많은 기능을 추가하고 sh
와 역호환이 되도록 합니다. 이론적으로 sh
bash
에서 실행되어야 합니다. bash
는 거의 모든 Linux/unix 시스템에서 사용할 수 있으며 일반적으로 기본적으로 사용됩니다. 단, MacOS가 Catalina(10.15) zsh
FreeBSD는 기본적으로 bash
설치된 상태로 제공되지 않습니다.
/bin/sh
/bin/bash
와 동일한 프로그램을 호출하거나 호출하지 않을 수 있습니다.
sh
는 최소한 POSIX에 필요한 기능을 지원합니다(올바른 구현을 가정). 확장 기능도 지원할 수 있습니다.
bash
는 "Bourne의 다시 쉘", 구현 sh 플러스 Bash 전용 확장에 필요한 기능을 제공합니다. 전체 확장 세트는 여기에서 설명하기에는 너무 길며 새 릴리스에 따라 다릅니다. 차이점은 bash 매뉴얼에 설명되어 있습니다. info bash
입력하고 "Bash 기능" 섹션(현재 버전의 섹션 6)을 읽거나 현재 문서를 온라인으로 읽으십시오.
최대한 쉽게 차이점: 기본적인 이해가 끝나면 위에 게시된 다른 의견을 파악하기가 더 쉬울 것입니다.
셸 - "셸"은 사용자와 운영 체제(커널) 간의 상호 작용을 용이하게 하는 프로그램입니다. sh, bash, csh, zsh... 등과 같은 많은 쉘 구현이 가능합니다.
셸 프로그램을 사용하여 해당 셸 프로그램에서 지원하는 명령을 실행할 수 있습니다.
배시 - 그것은 sh 되겠습니까 이득 ourne- B로부터 유래. 이 프로그램을 사용하여 Shell에서 지정한 모든 명령을 실행할 수 있습니다. 또한 이 프로그램에 특별히 추가된 일부 명령을 실행할 수 있습니다. Bash는 sh와 하위 호환성이 있습니다.
Sh - Bourne Sh ell에서 파생되었습니다. "sh"는 쉘에 지정된 모든 명령을 지원합니다. 즉, 이 프로그램을 사용하여 Shell에서 지정한 모든 명령을 실행할 수 있습니다.
자세한 내용은 다음을 수행하십시오. - https://man.cx/sh - https://man.cx/bash
Linux 운영 체제는 다양한 유형의 셸을 제공합니다. 쉘에는 공통된 명령이 많이 있지만 각 유형에는 고유한 기능이 있습니다. 주로 사용되는 다양한 종류의 쉘에 대해 알아보겠습니다.
sh 쉘:
Sh 쉘은 Bourne 쉘이라고도 합니다. Sh 셸은 1977년 AT&T 벨 연구소의 Stephen Bourne이 Unix 컴퓨터용으로 개발한 최초의 셸입니다. 여기에는 많은 스크립팅 도구가 포함되어 있습니다.
배쉬 쉘:
Bash 쉘은 Bourne Again Shell을 의미합니다. Bash 셸은 대부분의 Linux 배포판에서 기본 셸이며 Sh Shell을 대체합니다(Sh 셸은 Bash 셸에서도 실행됩니다). Bash Shell은 수정 없이 대다수의 Sh 셸 스크립트를 실행할 수 있으며 명령줄 편집 기능도 제공합니다.
출처 : http:www.stackoverflow.com/questions/5725296/difference-between-sh-and-bash