/usr/bin/envはどのプログラムを使用するのか、どうすればわかりますか?

/usr/bin/envはどのプログラムを使用するのか、どうすればわかりますか?

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/binPATH/home/joe/opt/python-2.5/binPATHPATH

#!/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

関連情報