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


62

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

env | grep -i python

6
ああ、私はそれを考え出したと思う
-tMC

私もそれについて疑問に思いました。そして、なぜ/ usr / bin / envなのか?/ bin / envまたはenvとは対照的に、envからパスのリストを取得するだけですか?
ファヒムミサ

「env」は完全なパスである必要があるため機能しません。「env」プログラムは通常/ user / bin / envにあります。一部のディストリビューションでは/ bin / envとしても見つかる場合がありますが、/ usr / bin / envを使用する方が安全です。
rettops

回答:


54

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

#!python

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

#!/usr/local/bin/python

pythonがインストールされるかもしれないようであるが非移植になり/bin/opt/python/bin他の場所を、またはどこ。

を使用して env

#!/usr/bin/env python

は移植可能な方法でOSにpython最初にあるものに相当するフルパスを指定することを許可するメソッドPATHです。


56

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

#!/usr/bin/python

最初の行で、スクリプトを実行すると、カーネルが実際に実行され/usr/bin/python /path/to/scriptます。しかし、それは便利ではありません。コマンドのフルパスを指定する必要があります。あなたは何を持っている場合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れている歴史的なUnixシステム/usr/binと最新のシステムは、の広範な使用のために正確にその場所を保持してい#!/usr/bin/envます。したがって、実際には、ユーザーのお気に入りのPythonインタープリターがスクリプトを実行する必要があることを指定する方法は次のとおりです。

#!/usr/bin/env python

2
その一つが間好まれるenvwhich?PATH環境から最も適格な実行可能ファイルも取得します。
ニキルマレー

8
@NikhilMulley whichは実行可能ファイルを見つけ、そのパスを出力します。env最初の引数で指定されたプログラムを見つけて実行し、残りの引数を渡します。
ケビン

3
それは本質的にenv評価版ですwhich
ニキルマレー

6

そう、実行:

env | grep PATH

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

「which」コマンドを使用して、検出されたディレクトリを確認できます。

which python

興味深いことに、sys.path有効化されたenv $ env python3['', '/home/user/test', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/home/user/.local/lib/python3.4/site-packages', '/usr/lib/python3.4/site-packages', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages'])と./env/bin/python3 (['', '/home/user/test', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/home/user/test/env3/lib/python3.4/site-packages'])の間でPythonに違いが見られます。
ThorSummoner
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.