"방탄 소년단"이 "#!"로 시작하는 이유는 무엇입니까?


10

왜와 "그녀 - 쾅"시작 않습니다 #!처럼 #!/bin/bash? 나는 이것이 어떻게 수행되는지 항상 인정했지만 그 뒤에 이유가 있습니까?

#; 그것은 일반적으로 주석이 아닙니까? 아니면 의견이 있어야 할 시점입니까?


4
Wikipedia 에는 #!#(이 라인이 기존 쉘에 의해 무시되어야 했는가)에 대한 설명을 포함하여 (dmr이 기억하는만큼) 의 상당히 자세한 역사가 있습니다.
Gilles 'SO- 악한 중지'

Wikipedia를 확인하지 못했습니다 :)
Johan

1
난 그냥 껍질이 외부 CR / LF를 벗길 수있을만큼 똑똑해 졌으면 좋겠다 ...))
Aaron D. Marasco

답변:


16

일반적으로 shebang#!( !일반적으로 "bang"이라고하며 "she"는 "SHArp"또는 "haSH"의 손상 인 것 같습니다 #)-전체 행을 shebang 행 이라고합니다.

처리 방법을 모르는 것들과의 역 호환성을 위해 주석 문자로 의도적으로 시작합니다. 은 !시작 파일 그래서 그냥 파일을 시작하는 임의의 코멘트를 구별하기 위해 아마도입니다 # this is my script!실행하려고하지 않는 this is my script!인터프리터


2
Bang !은 종종 다른 컨텍스트에서 실행될 명령을 나타 내기 위해 사용됩니다. 예를 들어 vim자체 명령 줄이있는 다른 프로그램에서 bang은 종종 내부 인터페이스 대신 시스템 쉘에서 명령을 실행하게하는 이스케이프 문자입니다.
Caleb

4

이것을 이해하려면 스크립트의 첫 번째 줄이 실제로 개의 다른 프로그램에 의해 두 번 읽힌다는 것을 알아야 합니다. 커널은 처음으로 파일을 열고 #!첫 번째 줄에서 해당 문자 시퀀스 ( )를 찾습니다 . 찾으면 파일 이름을 매개 변수로 전달하여 표시된 쉘 프로그램을 실행합니다. (예 : 파일 /home/me/foo이로 시작 #!/bin/sh하면 커널이 실행됩니다 /bin/sh /home/me/foo).

다음으로 쉘 ( bin/sh또는 모든 인터프리터 프로그램이 지정된)이 파일을 읽습니다. 쉘은 shebang 행에 대해 아무것도 모르지만 파일의 다른 행과 마찬가지로 첫 번째 행을 읽습니다 ... 모두 읽습니다. 쉘이 어떤 식 으로든 충돌하거나 동작을 변경하는 것을 원하지 않습니다. 그렇게하는 방법은 주석으로 처리하고 무시하는 것입니다. 따라서 커널 명령어로 시작하기에 가장 좋은 문자는 주석 문자입니다.


그것이 실제로 커널이 되었습니까? 현재 작업중인 쉘인 것처럼 들리며 shebang을 구문 분석하고 스크립트를 푸시합니다.
Johan

아뇨 ... 커널 자체이며, 직접, 직접 만나요. 쉘을 사용하여 스크립트를 실행하지 않더라도 작동합니다. 쉘 외에 파일을 실행하는 다른 방법이 있습니다. 예를 들어 "exec"시스템 호출을 사용하는 C 프로그램에서
JoelFan

en.wikipedia.org/wiki/Shebang_(Unix)#Magic_number "#!" ascii의 바이트는 0x23 0x21입니다. exec ()가이 바이트를 볼 때 동작은 나머지 행을 인터프리터의 경로로 취급합니다.
Aaron McMillin

1

이 방법으로 만 "interpretername scriptname"과 같은 스크립트를 실행하기 때문에 주석이어야합니다. 나는 "!"의 기원에 대해 모른다.


1
./scriptname 만 실행하더라도 인터프리터는 여전히 she-bang 행을 보이므로 여전히 주석이어야합니다.
psusi

1
또는 더 자세하게 말하면, 세방 : '#!' 인터프리터가 볼 수 없도록 설계되었으므로 주석 문자 '#'로 시작해야합니다. 대신 커널 'exec [lv] *'시스템 호출 세트에 의해 '보이고'해석됩니다.
arielf
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.