インタプリタのパスを指定せずに、代わりにインタプリタの名前を持ち、シェルが$ PATHを介して検索できるようにするshebangを持つことはできますか?
そうでない場合、何らかの理由がありますか?
ベストアンサー1
PATHルックアップは、環境変数と同様に、ユーザー空間の標準Cライブラリの機能です。カーネルは、呼び出し側から環境変数を渡さない限り、環境変数を見ることはできません。execve
新しいプロセスとして。
execve
カーネルは(PATHルックアップの実行などのラッパー関数によって異なりますexecvp
)またはshebang(ほぼexecve
内部的に呼び出しを再ルーティングする)でパス解析を実行しません。したがって、shebangに絶対パスを配置する必要があります。これもともとShebanの実装ほんの数行のコードが必要で、それ以降は大幅に拡張されていません。
Unixの最初のバージョンでは、シェルはユーザーがスクリプトを呼び出していることに気づいたときに独自の呼び出し操作を実行しました。 Shebangはいくつかの理由でカーネルに追加されました(要約するとデニスリッチの基本:
- 呼び出し側は、実行されるプログラムがシェルスクリプトかネイティブバイナリかを心配する必要はありません。
- スクリプト自体は、呼び出し元ではなく使用するインタプリタを指定します。
- カーネル使用ログのスクリプト名。
パスレスのshebangを使用するには、カーネルを強化して環境変数とプロセスにアクセスするか、カーネルにPATH
PATHルックアップを実行するユーザースペースプログラムを実行させる必要があります。最初のアプローチでは、カーネルに不均衡な複雑さを追加する必要があります。 2番目の方法はすでに利用可能です。#!/usr/bin/env
シェルボーン。
1相対パスを入力すると(スクリプトを含むディレクトリではなく)、プロセスの現在のディレクトリに基づいて解釈されるため、shebangではほとんど使用されません。