shebangを使用して#!/usr/bin/env python
スクリプトを実行すると、システムはpython
どのスクリプトを使用するかをどのように知ることができますか?python
環境変数でbinパスを見つけると、何も見つかりません。
env | grep -i python
答え1
これシェルボーン行(「sharp bang」、つまり#!
)はカーネルによって処理されます。カーネルはこのような環境変数について知りたくありませんPATH
。したがって、shebang行の名前は実行可能ファイルの絶対パスでなければなりません。スクリプト名の前に実行可能ファイルに渡す追加の引数を指定することもできます(ここでは説明しないシステム固有の制限があります)。たとえば、Pythonスクリプトでは、次のように指定できます。
#!/usr/bin/python
最初の行では、スクリプトを実行するとカーネルが実際に実行されます/usr/bin/python /path/to/script
。しかし、これは便利ではありません。コマンドのフルパスを指定する必要があります。一部のコンピュータと他のコンピュータに対する権限がある場合はpython
どうなりますか?または、特定のバージョンのPythonを有効にしますか?カーネルはユーザーに代わって照会を実行しないため、次の場所で必要なインタープリターを見つけるコマンドをカーネルに実行させることをお勧めします。/usr/bin
/usr/local/bin
PATH
/home/joe/opt/python-2.5/bin
PATH
PATH
#!/fixed/path/to/path-lookup-command python
path-lookup-command
実行可能ファイルの名前を引数として取得し、検索して実行する必要があります。PATH
カーネルが実行されます/fixed/path/to/path-lookup-command python /path/to/script
。そんなことが起こり、env
コマンドはまさにそのことをします。主な目的は、さまざまな環境でコマンドを実行することですが、コマンド名を見つけるため、$PATH
私たちの目的に最適です。
これは正式には保証されませんがenv
。/usr/bin
#!/usr/bin/env
#!/usr/bin/env python
答え2
shebangにはインタプリタが使用するフルパスが必要なので、次の構文は正しくありません。
#!python
次のようにフルパスを設定すると効果がある可能性があります。
#!/usr/local/bin/python
/bin
ただし、Pythonは/opt/python/bin
他の場所にインストールできるため、移植性はありません。
使用env
#!/usr/bin/env python
python
と同等のオペレーティングシステムへのフルパスを指定する移植可能な方法を許可する方法PATH
。
答え3
そうですね。以下を実行してください。
env | grep PATH
$ PATHはディレクトリのリストです。 Unixは、「python」が見つかるまでディレクトリのリストを順番に移動します。
「which」コマンドを使用して、見つかったディレクトリを確認できます。
which python