왜와 "그녀 - 쾅"시작 않습니다 #!처럼 #!/bin/bash? 나는 이것이 어떻게 수행되는지 항상 인정했지만 그 뒤에 이유가 있습니까?
왜 #; 그것은 일반적으로 주석이 아닙니까? 아니면 의견이 있어야 할 시점입니까?
왜와 "그녀 - 쾅"시작 않습니다 #!처럼 #!/bin/bash? 나는 이것이 어떻게 수행되는지 항상 인정했지만 그 뒤에 이유가 있습니까?
왜 #; 그것은 일반적으로 주석이 아닙니까? 아니면 의견이 있어야 할 시점입니까?
답변:
일반적으로 shebang 은 #!( !일반적으로 "bang"이라고하며 "she"는 "SHArp"또는 "haSH"의 손상 인 것 같습니다 #)-전체 행을 shebang 행 이라고합니다.
처리 방법을 모르는 것들과의 역 호환성을 위해 주석 문자로 의도적으로 시작합니다. 은 !시작 파일 그래서 그냥 파일을 시작하는 임의의 코멘트를 구별하기 위해 아마도입니다 # this is my script!실행하려고하지 않는 this is my script!인터프리터
!은 종종 다른 컨텍스트에서 실행될 명령을 나타 내기 위해 사용됩니다. 예를 들어 vim자체 명령 줄이있는 다른 프로그램에서 bang은 종종 내부 인터페이스 대신 시스템 쉘에서 명령을 실행하게하는 이스케이프 문자입니다.
이것을 이해하려면 스크립트의 첫 번째 줄이 실제로 두 개의 다른 프로그램에 의해 두 번 읽힌다는 것을 알아야 합니다. 커널은 처음으로 파일을 열고 #!첫 번째 줄에서 해당 문자 시퀀스 ( )를 찾습니다 . 찾으면 파일 이름을 매개 변수로 전달하여 표시된 쉘 프로그램을 실행합니다. (예 : 파일 /home/me/foo이로 시작 #!/bin/sh하면 커널이 실행됩니다 /bin/sh /home/me/foo).
다음으로 쉘 ( bin/sh또는 모든 인터프리터 프로그램이 지정된)이 파일을 읽습니다. 쉘은 shebang 행에 대해 아무것도 모르지만 파일의 다른 행과 마찬가지로 첫 번째 행을 읽습니다 ... 모두 읽습니다. 쉘이 어떤 식 으로든 충돌하거나 동작을 변경하는 것을 원하지 않습니다. 그렇게하는 방법은 주석으로 처리하고 무시하는 것입니다. 따라서 커널 명령어로 시작하기에 가장 좋은 문자는 주석 문자입니다.
#!왜#(이 라인이 기존 쉘에 의해 무시되어야 했는가)에 대한 설명을 포함하여 (dmr이 기억하는만큼) 의 상당히 자세한 역사가 있습니다.