OpenBSD의 sh:shebang은 사용되지 않습니다.

OpenBSD의 sh:shebang은 사용되지 않습니다.

세 개의 스크립트가 있는데 그 중 두 개는 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.

관련 정보