shebangヘッダーは常にインタプリタのインストールディレクトリと一致する必要がありますか?それでは、なぜ両方とも私にとって効果的ですか#!/usr/bin/python
?#!/usr/local/bin/python
答え1
他の人が指摘したように、shebang行は存在する実際のファイルを参照する必要があります。
これは、異なるシステムが異なる場所にバイナリをインストールできるため、スクリプトの移植性の弱点です。
他の人が述べたように、この問題を解決する1つの方法はリンクを使用することです。
別の方法は、システムの正しいパスを参照するようにスクリプトを編集することです。
/usr/bin/env
この問題を解決する別の方法は、PATHで実行可能ファイルを見つけることを使用することです。
だから代わりに:
#!/usr/bin/python
書く:
#!/usr/bin/env python
これにより、/usr/bin/env
個々の実行可能ファイルではなく、必要なときにのみシンボリックリンクをリンクできます。
もちろん、正しく機能するには、実行可能ファイルがPATHに存在する必要があります。
ご覧のとおり、100%のクリーンなソリューションはありません。覚えておいてください:「悪いほど良い」(:
答え2
(shebang)行は#!
実際の実行可能ファイルを指定する必要があります。どちらもシステムで実行している場合は、両方の場所にPythonがインストールされていることを意味します。あるいは、シンボリックリンクでも構いません。
通常、存在しないインタプリタを使用しようとするとエラーが発生します。
anthony@Zia:~$ /tmp/test
bash: /tmp/test: /usr/local/bin/python: bad interpreter: No such file or directory
次のようにスクリプトを実行すると、パスは重要ではない可能性があります。
anthony@Zia:~$ python /tmp/test
anthony@Zia:~$
Pythonを直接実行して引数を渡すからです。その後、Pythonはファイルを開き、それをスクリプトとして処理することにしました。最初のケースでは、カーネルはスクリプトを実行可能ファイルとして実行しようとします。これを確認し、shebang行に気づいた後、実際に実行できるように2番目の形式に変換しようとします。後で提供されたパスが#!
実際に存在しない場合は失敗します。
答え3
Shebangは次の文字の組み合わせです。#!
スクリプトの最初の行に表示されるとき。以下の文字列は常にインタプリタのパスです。/usr/bin/python
正確に何を確認してみましょう/usr/local/bin/python
。そのうちの1つは他のものへのシンボリックリンクです。次のコマンドの出力を提供できますか?
ls -l /usr/bin/python
ls -l /usr/local/bin/python