web-dev-qa-db-ja.com

/ usr / bin / envはどのプログラムを使用するかをどのようにして知るのですか?

シバンを使うとき#!/usr/bin/env pythonスクリプトを実行するには、システムはどのpythonを使用するかをどのようにして知るのですか?環境変数でpython binパスを探しても何も見つかりません。

env | grep -i python
65
tMC

シバンは、使用するインタープリターへのフルパスを想定しているため、次の構文は正しくありません。

#!python

このようにフルパスを設定するとうまくいくかもしれません:

#!/usr/local/bin/python

pythonは/bin/opt/python/bin、またはその他の場所にインストールされる可能性があるため、移植性はありません。

envの使用

#!/usr/bin/env python

は、pythonPATHに最初に配置されているパスと同等の完全パスをOSに指定するポータブルな方法を可能にする方法です。

55
jlliagre

Shebang 行(「シャープバン」から、つまり#!)はカーネルによって処理されます。カーネルは、PATHなどの環境変数について知りたくありません。したがって、Shebang行の名前は、実行可能ファイルへの絶対パスである必要があります。スクリプト名の前にその実行可能ファイルに渡す追加の引数を指定することもできます(システムに依存する制限があるため、ここでは触れません)。たとえば、Pythonスクリプトの場合、次のように指定できます。

#!/usr/bin/python

最初の行で、スクリプトを実行すると、カーネルは実際に/usr/bin/python /path/to/scriptを実行します。しかし、それは便利ではありません。コマンドの完全パスを指定する必要があります。一部のマシンでは/usr/binpythonがあり、他のマシンでは/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/binenvを提供しており、最近のシステムは#!/usr/bin/envが広く使用されているため正確にその場所を維持しています。したがって、実際には、スクリプトをユーザーのお気に入りのPythonインタープリターが実行する必要があることを指定する方法は、

#!/usr/bin/env python

そうです、実行してください:

env | grep PATH

$ PATHはディレクトリのリストです。 Unixは、「python」が見つかるまで、ディレクトリのリストを順番に調べます。

「which」コマンドを使用して、どのディレクトリが見つかったかを確認できます。

which python
7
Dan Rue