2010-11-24 5 views
4

# :로 시작하는 누군가 오늘 나에게 스크립트를 보내고, 검색 후 아무런 답을 찾지 못했습니다.#!/bin/sh와 # :/bin/sh의 차이점

스크립트가 작동하더라도 나는 그 의미가 무엇인지 궁금합니다.

+0

'#!'을 (를) 참조하는 경우 오타가 될 수 있습니다 ... –

답변

13

와우! 그것은 많은 추억을 되 살릴 것입니다!

1980 년대와 1990 년대 초반에 Bourne 쉘 (/bin/sh)과 C 쉘 (/bin/csh)의 두 기본 쉘이있었습니다.

본쉘은 사용자 친화적 인 기능이 거의 없습니다. 별칭이나 명령 대체가 없었습니다. 따라서 대부분의 사람들은 기본 셸로 C 셸을 사용하는 것을 좋아했습니다.

그러나 Csh는 끔찍한 스크립팅 언어였습니다. (http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/ 참조). 따라서 C 쉘을 쉘로 사용했지만 Bourne 쉘에 스크립트를 작성했는데 구문이 훨씬 낫습니다.

그러나 약간의 문제가있었습니다. 기본 셸이 C 셸이므로 명령 줄에 셸 스크립트 이름을 입력하면 C 셸이이를 받아 들여 실행하려고합니다.

이 문제를 해결하려면 :을 프로그램의 첫 번째 줄에 넣습니다. 이것은 Bourne 쉘 주석 이었지만 유효하지 않은 C 쉘 명령이었습니다. 따라서 스크립트 앞에 sh을 넣는 것을 잊어 버리면 스크립트가 실행되지 않습니다.

나중에 시스템은 첫 번째 줄이 :인지 여부를 알 수 있습니다.이 줄은 Bourne 셸 스크립트 여야합니다. 그리고 심지어 나중에 #:을 넣으면 주석이되고 명령이 아닙니다. 어떤 사람들은 셸의 이름을 /bin/sh 옆에두고 사람들이 Bourne 셸 스크립트로 실행한다고 생각 나게하는 데 도움을줍니다.

Kornshell이 ​​인기를 얻기 시작한 후 C 쉘이 죽기 시작했습니다. 이 때쯤에 shebang (#!)이 나왔지만 AT & T와 Berkeley 파생 시스템이 아닙니다. BSD 시스템은 1980 년대 후반까지는시 뱅을 얻지 못했습니다. 그리고 썬은 솔라리스가 나올 때까지 C 셸을 기본 셸로 사용했습니다.

나는 프로그램을 보지 못했지만 연령은 #: /bin/sh으로 시작합니다.

#! /usr/bin/env perl 

이 방법, 당신은 당신의 경로에의 펄 버전을 사용하고있는 어떤 디렉토리 걱정할 필요가 없습니다 :

BTW, 당신의 스크립트 이런 식으로 시작하는 것이 일반적이다.예를 들어, 당신이 스크립트를 시작하면 :

#! /usr/local/bin/perl 

그리고, 펄 /usr/bin에 실제로, 스크립트가 실행되지 않습니다. env 프로그램은 항상 /usr/bin이며 작동이 보장됩니다. 물론 경로에있는 Perl이 아닌 특정 버전의 Perl을 사용하려면 첫 번째 방법을 사용하십시오.

+0

다른 곳에서'env'를 사용하는 [이상한 시스템] (http://en.wikipedia.org/wiki/Shebang_ (Unix))이 있습니다. –

+0

관련성있는 답변을 보내 주셔서 감사합니다! – Vlagorce

+0

@Dennis :/usr/bin/env 대신에/bin/env가있는 시스템이 있다는 것을 확실히 알지 못했지만 그 일은 더 까다 롭습니다. 그러나 두 시스템은 SCO의 OpenServer와 Cray UNICO (또는 이와 비슷한 것)를 지적했습니다./usr/bin/env는 보편적이지는 않지만 꽤 가까이에 있습니다. 심지어 보편적으로 fine-structure constant, Alpha, –

2

이것은 ...

#:/bin/sh 

오두막은 # 주석 만입니다! #로 시작하는 모든 것은 주석입니다.

예 :

실행

#!/usr/bin/perl 

하고 펄에 의해 실행됩니다로 시작하는 스크립트. 자, '!' ':'을 입력하면 쉘 (shell) 인 defaut interpreter로 실행하게됩니다.

+0

완전히 수정하십시오. 그냥 작은 메모. 역사적인 이유 때문에 '#!'다음에 공백이 우선입니다. –

+0

@ 디에고 : 나는 그러한 역사적인 이유가 오늘날에는 아무도 그 공간을 사용하지 않는 그러한 은폐되고 노후화 된 시스템과 관련이 있다고 믿습니다. –

+0

"#!/usr/bin/env perl"을 수행 할 수도 있습니다. 그렇게하면 스크립트는 "perl"이 $ PATH 환경 변수에있는 한 작동합니다. Perl을/bin,/usr/bin/또는/usr/local/bin에있는 시스템을 사용했습니다. 한 시스템에서 스크립트를 테스트하고 스크립트에 "#!/bin/perl"을 넣었으나 다른 시스템에서 "/ usr/local/bin/perl"에 있기 때문에 다른 시스템에서 스크립트를 테스트 할 때 고통 스럽습니다 . –