シバンを使うとき#!/usr/bin/env python
スクリプトを実行するには、システムはどのpython
を使用するかをどのようにして知るのですか?環境変数でpython
binパスを探しても何も見つかりません。
env | grep -i python
シバンは、使用するインタープリターへのフルパスを想定しているため、次の構文は正しくありません。
#!python
このようにフルパスを設定するとうまくいくかもしれません:
#!/usr/local/bin/python
pythonは/bin
、/opt/python/bin
、またはその他の場所にインストールされる可能性があるため、移植性はありません。
env
の使用
#!/usr/bin/env python
は、python
がPATH
に最初に配置されているパスと同等の完全パスをOSに指定するポータブルな方法を可能にする方法です。
Shebang 行(「シャープバン」から、つまり#!
)はカーネルによって処理されます。カーネルは、PATH
などの環境変数について知りたくありません。したがって、Shebang行の名前は、実行可能ファイルへの絶対パスである必要があります。スクリプト名の前にその実行可能ファイルに渡す追加の引数を指定することもできます(システムに依存する制限があるため、ここでは触れません)。たとえば、Pythonスクリプトの場合、次のように指定できます。
#!/usr/bin/python
最初の行で、スクリプトを実行すると、カーネルは実際に/usr/bin/python /path/to/script
を実行します。しかし、それは便利ではありません。コマンドの完全パスを指定する必要があります。一部のマシンでは/usr/bin
にpython
があり、他のマシンでは/usr/local/bin
がある場合はどうなりますか?または、特定のバージョンのPythonを使用するように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
でコマンド名を検索するため、ここでの目的に最適です。
これは公式に保証されていませんが、歴史的なUnixシステムは/usr/bin
でenv
を提供しており、最近のシステムは#!/usr/bin/env
が広く使用されているため正確にその場所を維持しています。したがって、実際には、スクリプトをユーザーのお気に入りのPythonインタープリターが実行する必要があることを指定する方法は、
#!/usr/bin/env python
そうです、実行してください:
env | grep PATH
$ PATHはディレクトリのリストです。 Unixは、「python」が見つかるまで、ディレクトリのリストを順番に調べます。
「which」コマンドを使用して、どのディレクトリが見つかったかを確認できます。
which python