Shebang은 Linux에서 스크립트를 참조할 수 있습니다.

Shebang은 Linux에서 스크립트를 참조할 수 있습니다.

#!/bin/bash예를 들어 Shebang 라인의 대상은 스크립트가 아니라 바이너리 실행 파일이어야 한다는 말을 계속 들었습니다 . 이는 MacOS와 같은 많은 운영 체제에서 여전히 적용됩니다. 그러나 놀랍게도 Linux에서는 그렇지 않습니다. Linux에서는 최대 4개 수준의 스크립트를 가질 수 있으며 네 번째 스크립트는 shebang 라인에서 실행 가능한 바이너리를 참조합니다. 그러나 레벨 5 스크립트를 사용하면 프로그램이 오류와 함께 실패합니다 Too many levels of symbolic links.

보다LWN 기사 "프로그램 작동 방식"다음 코드는 기사에 표시되지 않습니다.

$ cat wrapper2
#!./wrapper

이 변경은 언제 발생합니까(특정 시점에서 허용되지 않는다고 가정)?

답변1

~에 따르면스벤 마체크(보통 신뢰할 수 있고 정보가 풍부함):

인터프리터 자체를 #!스크립트로 사용하거나 중첩할 수 있나요 #!?

(…)
Linux와 Minix는 2.6.27.9부터 이를 허용합니다. 2.

(…)

보다커널 패치 (패치는 2.6.27.9에 적용됨), 특히 참조binfmt_script.c중요한 부분이 포함되어 있습니다. Linux에서는 최대 BINPRM_MAX_RECURSION4단계의 중첩이 허용됩니다.

이 재귀에는 Linux에서 구현된 간접 실행 메커니즘( #!binfmt_misc를 통해 등록된 스크립트 및 실행 파일 형식)이 포함됩니다. 예를 들어, #!Qemu를 통해 전달되고 3단계 중첩으로 계산되는 외부 아키텍처 바이너리로 전달되는 바이트코드로 작성된 인터프리터를 가리키는 줄이 있는 스크립트가 있을 수 있습니다 .

Sven Mascheck는 또한 중첩된 shebang에 대한 BSD 지원은 없지만 커널이 오류를 반환하면 일부 쉘이 이를 대신할 것이라고 지적했습니다.

관련 정보