- bash shebang은 무엇을 합니까?
./file
파일을 사용하는 것과 실행하는 것의 차이점은 무엇입니까sh file
?- bash는 그것을 어떻게 이해합니까?
답변1
- Shebang의 기능은 다음과 같습니다.
인터프리터 지시문을 사용하면 스크립트와 데이터 파일을 명령으로 사용할 수 있으므로 명령줄에서 인터프리터 앞에 스크립트를 붙일 필요가 없으므로 사용자와 다른 프로그램에서 구현 세부 정보를 숨길 수 있습니다.
- ./file 또는 sh 파일을 사용하여 파일을 실행하는 것의 차이점은 무엇입니까?
some/path/to/foo 경로로 식별되는 Bourne 쉘 스크립트에는 첫 줄이 있습니다.
#!/bin/sh -x
매개변수 bar 및 baz를 사용하여 실행합니다.
some/path/to/foo bar baz
실제로 다음 명령줄을 실행하는 것과 유사한 결과를 제공합니다.
/bin/sh -x some/path/to/foo bar baz
참고: Dennis Ritchie는 1980년에 인터프리터 명령어에 대한 커널 지원을 도입했습니다.
The system has been changed so that if a file being executed begins with the magic characters #! , the rest of the line is understood to be the name of an interpreter for the executed file. Previously (and in fact still) the shell did much of this job; it automatically executed itself on a text file with executable mode when the text file's name was typed as a command. Putting the facility into the system gives the following benefits. 1) It makes shell scripts more like real executable files, because they can be the subject of 'exec.' 2) If you do a 'ps' while such a command is running, its real name appears instead of 'sh'. Likewise, accounting is done on the basis of the real name. 3) Shell scripts can be set-user-ID.
참고: Linux는 해석된 모든 실행 파일(즉, #! 행으로 시작하는 실행 파일)에서 setuid 비트를 무시합니다.
4) It is simpler to have alternate shells available; e.g. if you like the Berkeley csh there is no question about which shell is to interpret a file. 5) It will allow other interpreters to fit in more smoothly.
추가 정보:
답변2
해시뱅의 기능은 다음과 같습니다.핵심파일이 실행될 때 스크립트 인터프리터로 실행되는 프로그램은 무엇입니까?
프로그램 을 실행하려면 ./program
해당 파일에 대한 실행 권한이 필요하지만 어떤 유형의 프로그램인지는 모르겠습니다. bash 스크립트, sh 스크립트, Perl, Python, awk 또는 Expect 스크립트 또는 실제 바이너리 실행 파일일 수 있습니다. 실행하면 다른 어떤 것도 실행되지 않고 sh program
아래에서 실행됩니다 .sh
sh
와는 다르다는 점 참고해주세요 bash
!후자에는 표준 셸에 알려지지 않은 많은 고급 기능이 있습니다. 시스템에 따라 sh
다른 프로그램일 수도 있고 호환 모드의 Bash일 수도 있지만 결과는 일반적으로 동일합니다. 고급 기능에 액세스할 수 없습니다.
Bash 자체는 hashbang 줄을 이해하지 못하지만 이를 읽기 위해 커널에 의존합니다. 반면 Perl 인터프리터는 시작 방법에 관계없이 hashbang 줄 자체를 읽습니다. hashbang 줄에 설정된 명령줄 옵션을 선택하기 위해 그렇게 합니다. 배쉬는 이런 일을 하지 않습니다.
./script
예를 들어, 다음 스크립트는 ( exec
hashbang 라인을 통해) 또는 bash script
(bash 인터프리터를 수동으로 실행하여) 시작되었는지 여부에 따라 동작이 다릅니다 .
#!/bin/bash -u
echo $1
답변3
bash
shebang 줄 자체는 아무 의미가 없으며 단지 주석으로 처리됩니다. 쉘이 명령줄을 읽고 명령이 외부 프로그램인 경우 cd
( execve
. 그런 다음 커널은 execve
파일에 전달된 실행 파일 유형을 확인하여 확인합니다.매직넘버파일의 시작 부분에. 매직 넘버가 2바이트 0x23 0x21(ASCII 문자 #!
)로 구성되면 커널은 그 뒤에 스크립트 인터프리터에 대한 절대 경로가 따른다고 가정합니다. 그런 다음 커널은 인터프리터를 시작하여 스크립트에 전달합니다.
답변4
글쎄요, 100% 정확하게 말하자면 "bash shebang"에는 별 내용이 없습니다. Shebang은 다양한 형태로 나타날 수 있습니다. 이것은 단지 통역사 지시문일 뿐입니다. 예를 들어 shebang이 #!/usr/bin/perl
f.ex를 할 수 있다고 가정해 봅시다. "perl shebang"이며 Perl 인터프리터에게 그러한 스크립트에 대한 인터프리터 역할을 하도록 지시합니다. 그런 다음 이러한 Perl 스크립트를 쉘 스크립트처럼 직접 호출할 수 있습니다. 다른 스크립트 인터프리터에도 동일하게 적용됩니다. 이는 php, cshell, prolog, basic 또는 어떤 방식으로든 텍스트 파일을 해석하는 기타 프로그램일 수 있습니다. 물론 통역사는 셰뱅을 무시할 수 있어야 합니다. bash의 경우 이는 단지 주석 줄일 뿐입니다. PHP와 Perl도 마찬가지입니다. 나는 프롤로그가 그 진술에 질식할 것이라고 생각한다. shebang은 또한 텍스트를 해석하고 shebang을 무시할 수 있는 한 귀하의 애플리케이션과 원활하게 작동해야 합니다.
f.ex.라면 흥미로울 것입니다. JavaScript 인터프리터는 이러한 "Javascript shebang"을 무시할 수 있습니다. :)