shebang에 관한 bash 매뉴얼에서
대부분의 Unix 버전에는 이를 운영 체제의 명령 실행 메커니즘의 일부로 포함합니다. 스크립트의 첫 번째 줄이 두 문자 "#!"으로 시작하면 줄의 나머지 부분은 프로그램의 인터프리터를 지정합니다. 따라서 Bash, awk, Perl 또는 기타 인터프리터를 지정하고 나머지 스크립트 파일을 해당 언어로 작성할 수 있습니다.
통역사에게 제시된 주장포함하다단일 선택적 매개변수스크립트 파일의 첫 번째 줄에 인터프리터 이름 다음에스크립트 파일의 이름, 이어서 나머지 주장. Bash는 이를 기본적으로 처리하지 않는 운영 체제에서 이 작업을 수행합니다. 일부 이전 버전의 Unix에서는 인터프리터 이름과 인수를 최대 32자로 제한합니다.
"선택적 매개변수"란 옵션의 매개변수 또는 존재할 수도 있고 존재하지 않을 수도 있는 매개변수를 의미합니까?
왜 "단일 선택적 매개변수"인가요? 여러 개의 "선택적 매개변수"를 허용하지 않습니까?
스크립트가 다음과 같다면
#! /path/to/interpreter --opt1 opt1-arg --opt2 opt2-arg --opt3 nonopt-arg1 nonopt-arg2
...
Bash에서 스크립트를 실행할 때
$ myscript arg1 arg2 arg3
Bash에서 실행되는 실제 명령은 무엇입니까? 응
$ /path/to/interpreter --opt1 opt1-arg --opt2 opt2-arg --opt3 nonopt-arg1 nonopt-arg2 myscript arg1 arg2 arg3
감사해요.
답변1
이 경우 인터프리터의 인수는 shebang 라인을 해석한 후 이를 스크립트 이름 및 해당 명령줄 인수와 결합하여 구성한 인수입니다.
따라서 AWK 스크립트는 다음으로 끝납니다.
#! /usr/bin/awk -f
이름을 붙이고 myscript
불렀다
./myscript file1 file2
결과는 실제 매개변수입니다.
/usr/bin/awk -f ./myscript file1 file2
-f
이 경우 단일 선택적 매개변수입니다. 모든 통역사가 하나를 요구하는 것은 아니며( /bin/sh
예제 참조) 많은 시스템은 최대 하나만 허용합니다(그래서 shebang 라인은 예상대로 작동하지 않습니다). 그러나 인수에는 공백이 포함될 수 있습니다. 인터프리터 뒤의 shebang 줄의 전체 내용은 단일 인수로 전달됩니다.
shebang 라인을 실험하려면 다음을 사용할 수 있습니다 #! /bin/echo
(단, 공백이 포함된 경우 매개변수를 구별하는 데 도움이 되지는 않습니다).
바라보다프로그램 작동 방식Shebang 줄을 처리하는 방법에 대한 자세한 지침(Linux에서)
답변2
맨페이지를 읽어보세요 execve(2)
. 개별 선택적 매개변수에 대한 제한은 운영 체제에 따라 다릅니다. Linux는 인터프리터 뒤의 모든 단어를 매개변수로 처리합니다.
이를 수행하려면 다음을 수행하십시오.
#! /path/to/interpreter --opt1 opt1-arg --opt2 opt2-arg --opt3 nonopt-arg1 nonopt-arg2
사실 넌 이렇게 해야 해
#!/bin/sh
exec /path/to/interpreter --opt1 opt1-arg --opt2 opt2-arg --opt3 nonopt-arg1 nonopt-arg2 "$@"
# ...................................................................................... ^^^^
env
업데이트: 프로그램에 이 목적을 위한 옵션이 있다는 것을 알았습니다 -S
. shebang이 될 수 있습니다(이 프로그램을 유지해야 한다면 불행하겠지만)
#!/usr/bin/env -S /path/to/interpreter --opt1 opt1-arg --opt2 opt2-arg --opt3 nonopt-arg1 nonopt-arg2
맨페이지를 읽어보세요 env(1)
.