it-swarm.com.de

Woher weiß / usr / bin / env, welches Programm verwendet werden soll?

Wenn ich den Shebang benutze #!/usr/bin/env python um ein Skript auszuführen, woher weiß das System, welches python verwendet werden soll? Wenn ich in den Umgebungsvariablen nach einem python bin-Pfad suche, finde ich nichts.

env | grep -i python
65
tMC

Der Shebang erwartet, dass ein vollständiger Pfad zum Interpreter verwendet wird, sodass die folgende Syntax falsch wäre:

#!python

Das Festlegen eines vollständigen Pfads wie folgt könnte funktionieren:

#!/usr/local/bin/python

dies wäre jedoch nicht portierbar, da python möglicherweise in /bin, /opt/python/bin oder an einem anderen Ort installiert ist.

Verwenden von env

#!/usr/bin/env python

ist eine Methode, mit der auf tragbare Weise dem Betriebssystem ein vollständiger Pfad angegeben werden kann, der dem Pfad entspricht, in dem sich python zuerst in PATH befindet.

55
jlliagre

Die Zeile Shebang (von "scharfem Knall", d. H. #!) Wird vom Kernel verarbeitet. Der Kernel möchte keine Informationen zu Umgebungsvariablen wie PATH erhalten. Der Name in der Shebang-Zeile muss also ein absoluter Pfad zu einer ausführbaren Datei sein. Sie können auch ein zusätzliches Argument angeben, das vor dem Skriptnamen an diese ausführbare Datei übergeben werden soll (mit systemabhängigen Einschränkungen werde ich hier nicht näher darauf eingehen). Beispielsweise können Sie für ein Python -Skript) angeben

#!/usr/bin/python

in der ersten Zeile und wenn Sie das Skript ausführen, führt der Kernel tatsächlich /usr/bin/python /path/to/script aus. Dies ist jedoch nicht praktisch: Sie müssen den vollständigen Pfad des Befehls angeben. Was ist, wenn Sie auf einigen Computern python in /usr/bin Und auf anderen /usr/local/bin Haben? Oder möchten Sie Ihr PATH auf /home/joe/opt/python-2.5/bin Setzen, um eine bestimmte Version von Python zu verwenden? Da der Kernel die Suche nach PATH nicht für Sie ausführt, besteht die Idee darin, den Kernel einen Befehl ausführen zu lassen, der wiederum den gewünschten Interpreter in PATH nachschlägt:

#!/fixed/path/to/path-lookup-command python

Das path-lookup-command Muss den Namen einer ausführbaren Datei als Argument nehmen und in PATH nachschlagen und ausführen: Der Kernel wird /fixed/path/to/path-lookup-command python /path/to/script Ausführen. Der Befehl env macht genau das. Der Hauptzweck besteht darin, einen Befehl in einer anderen Umgebung auszuführen. Da der Befehlsname jedoch in $PATH Nachgeschlagen wird, ist er für unseren Zweck hier perfekt.

Obwohl dies nicht offiziell garantiert ist, haben historische Unix-Systeme env in /usr/bin Bereitgestellt, und moderne Systeme haben diesen Speicherort genau wegen der weit verbreiteten Verwendung von #!/usr/bin/env Behalten. In der Praxis kann also angegeben werden, dass ein Skript vom Favoriten des Benutzers ausgeführt werden muss Python Interpreter ist

#!/usr/bin/env python

Richtig, also lauf:

env | grep PATH

Ihr $ PATH ist eine Liste von Verzeichnissen. Unix geht diese Liste von Verzeichnissen der Reihe nach durch, bis es "Python" findet.

Mit dem Befehl 'which' können Sie sehen, welches Verzeichnis gefunden wird:

which python
7
Dan Rue