#!/bin/bash
たとえば、Shebang行のターゲットは、スクリプトではなくバイナリ実行可能ファイルでなければならないと言っていました。これは、MacOS などの多くのオペレーティングシステムでまだ適用されます。しかし、驚くべきことに、Linuxではそうではありません。 Linuxでは、最大4つのレベルのスクリプトを持つことができ、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_RECURSION
4段階のネストが可能です。
この再帰には、Linuxで実装された間接実行メカニズム(#!
binfmt_miscを介して登録されたスクリプトと実行可能ファイル形式)が含まれます。たとえば、#!
Qemuを介して渡され、3段階のネストとして計算される外部アーキテクチャバイナリに渡されるバイトコードで書かれたインタプリタを指す行を持つスクリプトがあります。
Sven Mascheckはまた、入れ子になったshebangのBSDサポートはありませんが、カーネルがエラーを返すと、一部のシェルがそれに代わるものと指摘しました。