세 개의 스크립트가 있는데 그 중 두 개는 shebang으로 사용됩니다.
shebang-1
#!/bin/sh
echo "#1"
exec sh -- "$@"
shebang-2
그것은 사용한다shebang-1
#!/home/a/ex/shebang-1
echo "#2"
exec sh -- "$@"
script
#!/home/a/ex/shebang-2
echo script...
내가 실행할 때 script
, 나는 기대한다
#1
#2
script...
대신에 나는 단지 얻는다
$ ./script
script...
명시적으로 호출하면 작동합니다.
$ ./shebang-1 ./shebang-2 ./script
#1
#2
script...
파일에는 다음 권한이 있습니다
$ ls -l
total 24
-rwx------ 1 a a 38 Sep 3 18:00 script*
-rwx------ 1 a a 38 Sep 3 18:05 shebang-1*
-rwx------ 1 a a 50 Sep 3 18:05 shebang-2*
여기서 문제가 무엇입니까?
답변1
OpenBSD는 shebangs의 shebanged 스크립트인 인터프리터를 지원하지 않습니다. 인터프리터는 실제 바이너리여야 합니다.
실행 시도가 script
실패 하면 쉘은 설명된 대로 스크립트를 첫 번째 인수로 실행 ENOEXEC
하도록 대체됩니다 ./bin/sh
execve(2)
exec
쉘, Perl의 , xargs(1)
또는 쉘 동작을 에뮬레이트하는 다른 래퍼 env(1)
를 통하지 않고 스크립트를 직접 실행하여 execvp(3)
이를 확인할 수 있습니다.
기록이 없으면 볼 수 있습니다.소스 코드.
어쨌든, OpenBSD는 Linux를 제외한 대부분의 다른 시스템과 같습니다. 제가 아는 한 Linux만이 다른 스크립트를 레벨 4까지 인터프리터로 지원하는 것으로 보이며 그 이후 execve
에는 ELOOP
.