#! / bin / sh와 #! / bin / bash의 차이점은 무엇입니까?


280

내가 쓰면

#!/bin/bash
echo "foo"

또는

#!/bin/sh
echo "foo"

둘 다 동일합니다. #!/bin/sh또는로 시작하는 일부 스크립트를 보았습니다 #!/bin/bash. 그들 사이에 차이점이 있습니까?

답변:


242

bash그리고 sh두 개의 서로 다른 포탄입니다. 기본적 bash이며 sh더 많은 기능과 더 나은 구문. 대부분의 명령은 동일하게 작동하지만 다릅니다.

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

자세한 정보는 http://man.cx/sh , http://man.cx/bash 입니다.


24
첫 번째 단락은 오해의 소지가 있습니다. "sh"는 전혀 셸이 아니라 현재 구성된 시스템 셸에 대한 심볼릭 링크 이며, Linux 시스템에서는 일반적으로 bash 또는 dash (후자를 사용하는 최신 버전의 Ubuntu)입니다.
thomasrutter 1

18
/bin/shbash는 1977 년에 bourne shell이라는 쉘로 사용 되었습니다. bash는 / bin / sh 호환 쉘로 posix 호환 되는 Bourne 쉘 대체품으로 사용할 있습니다. en.wikipedia.org/wiki/Bourne_shell
Alex

5
bash 는 사실상의 표준 (매우 널리 사용되는)이지만 "표준"이 아닙니다. Ubuntu에서 sh 는 posix 호환 쉘인 dash를 사용 하므로 실제로 표준입니다. 필자의 조언은 스크립팅, 특히 서버 측 스크립트에 대해 가능한 한 대시 를 사용하는 것 입니다. 하지만 배쉬는 더 표현하고, 대시 빨리 꽤 많이 실행하고 더 안전합니다.
Rick-777

@ Rick-777 따라서 스크립트 상단에 #! / bin / dash를 명시 적으로 넣어야합니까? 또한 명령을 작성하고 ./scriptName으로 실행하는 스크립트를 작성했으며 정상적으로 작동했습니다. #! / bin / yourShellHere가 필요합니까?
user137717

@ Rick-777 #! / bin / shellName을 제외하는 경우 파일 이름을 fileName.sh로 지정했습니다. #! / bin / sh를 선언하지 않고 선호하는 시스템 셸에 암시 적으로 연결됩니까?
user137717

82

Linux 및 기타 유닉스 계열 시스템에서는 다중 쉘을 선택할 수 있습니다.

쉘은 작은 프롬프트를 그리는 것뿐만 아니라 파이프, 조건부 등과 같은 복잡한 논리를 넣는 경우 명령을 해석하는 역할을합니다.

bash 는 Linux 시스템 사용자를위한 기본 쉘로 사용되는 가장 일반적인 쉘입니다. 유닉스 역사에서 사용 된 다른 껍질의 영적 후손입니다. 그 이름은, 배쉬는 Bourne의-다시 쉘, 그것은 또한 C 쉘 및 Korn 쉘의 기능을 통합하지만 그것이 대체하도록 설계되었습니다 Bourne 쉘에 대한 경의의 약어입니다.

요즘부터 실행 /bin/bash됩니다-bash가있는 모든 시스템에서 여기에 액세스 할 수 있습니다.

그러나 쉘을 사용하는 것은 사용자 만이 아닙니다. 스크립트 ( 쉘 스크립트 )는이를 해석하기 위해 쉘이 필요합니다. 쉘 스크립트를 실행할 때 시스템은 스크립트를 실행하기 위해 쉘 프로세스를 시작해야합니다.

문제는 다른 쉘이 그들 사이에 약간의 불일치를 가지고 있으며 스크립트 실행과 관련하여 실제로 문제가 될 수 있다는 것입니다. bash 에는 다른 쉘이 아닌 bash에만 고유 한 많은 스크립팅 기능이 있습니다. 항상 bash를 사용하여 해당 스크립트를 실행한다면 괜찮습니다. 다른 쉘은 bash를 에뮬레이션하거나 POSIX 표준을 준수하려고 시도 할 수 있습니다. POSIX 표준은 bash가 꽤 잘 지원합니다 (자체 확장 기능을 추가하더라도).

쉘 스크립트의 맨 위에 shebang을 사용하여 실행할 쉘을 지정할 수 있습니다. 스크립트는 #!/bin/bash첫 번째 행에 지정할 수 있습니다. 즉, 스크립트는 다른 쉘이 아닌 항상 bash로 실행되어야합니다.

/ bin / sh시스템 셸을 나타내는 실행 파일 입니다. 실제로, 일반적으로 시스템 쉘인 쉘에 대한 실행 파일을 가리키는 기호 링크로 구현됩니다. 시스템 쉘은 시스템 스크립트가 사용해야하는 일종의 기본 쉘입니다. Linux 배포판에서 오랫동안 이것은 일반적으로 bash에 대한 심볼릭 링크 였으므로 항상 / bin / sh를 bash 또는 bash 호환 쉘에 연결하는 것이 다소 관례가되었습니다. 그러나 지난 몇 년 동안 데비안과 우분투는 시스템 쉘을 bash에서 dash 로 전환하기로 결정했습니다.-비슷한 쉘-/ bin / sh에 bash를 사용하는 Linux (GNU)의 오랜 전통을 깨고 있습니다. Dash는 부팅 속도 (및 패키지 설치 스크립트와 같은 많은 쉘 스크립트가 필요한 다른 것들)에 도움이 될 수있는 더 가볍고 훨씬 빠른 쉘로 보입니다.

대시는 동일한 POSIX 표준을 기반으로하는 bash와 상당히 호환됩니다. 그러나 bash 특정 확장은 구현하지 않습니다. #!/bin/shShebang으로 (시스템 쉘) 을 사용 하지만 bash 특정 확장자가 필요한 스크립트가 있습니다 . 이것은 현재 데비안과 우분투에 의해 수정되어야 하는 버그로 간주 되는데, 데비안과 우분투는 / bin / sh가 대시를 가리킬 때 작동 할 수 있어야합니다.

Ubuntu의 시스템 셸 이 대시를 가리키고 있지만 현재 사용자로서의 로그인 셸 은 계속 bash입니다. 즉, Linux 어디에서나 터미널 에뮬레이터에 로그인하면 로그인 쉘이 bash가됩니다. 쉘이 대화식으로 사용될 때 작업 속도는 그리 큰 문제가되지 않으며 사용자는 bash에 익숙하며 홈 디렉토리에 bash 특정 사용자 정의가있을 수 있습니다.

스크립트를 작성할 때 사용해야 할 것

스크립트에 bash에서만 지원되는 기능이 필요한 경우을 사용하십시오 #!/bin/bash.

그러나 가능하다면 스크립트가 POSIX와 호환되는지 확인하고을 사용 #!/bin/sh하면 설치시 항상 선호하는 POSIX 호환 시스템 쉘을 가리켜 야합니다.


18

이전 답변 외에도에 /bin/sh대한 심볼릭 링크가 /bin/bash#!/bin/sh완전히 같지 않습니다 #!/bin/bash.

로부터 bash는 (1) 매뉴얼 페이지 :

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

예를 들어 bash 특정 구문은 다음과 같습니다.

 exec  > >(tee logfile.txt)

#!/bin/shsh-> bash 심볼릭 링크가있는 경우에도으로 시작하는 쉘에 오류 가 발생합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.