Ich verwende macOS High Sierra und habe dieses merkwürdige Verhalten des Systems Python festgestellt.
Es handelt sich dabei also /usr/bin/xattr
um ein Python-Skript, das sofort eine Fehlermeldung ausgibt und beendet wird; und /usr/bin/xattr-2.7
es ist das Skript, das die eigentliche Xattr-Arbeit erledigt.
/usr/bin/xattr
Wenn ich oder xattr
oder ausführe /usr/bin/python /usr/bin/xattr
, werden sie alle /usr/bin/xattr-2.7
anstelle von ausgeführt /usr/bin/xattr
. Beachten Sie, dass es keine Möglichkeit gibt, /usr/bin/xattr
die Steuerung auf umzuleiten /usr/bin/xattr-2.7
. Es wird sofort eine Fehlermeldung ausgegeben.
Wenn ich aber das Verzeichnis ändere /usr/bin
und ausführe /usr/bin/python ./xattr
oder einfach nur ./xattr
, wird die echte Version ausgeführt /usr/bin/xattr
und die Fehlermeldung gedruckt.
Ich frage mich also, welche Magie hier im Spiel ist. Es scheint, als ob das vorinstallierte Python in der Lage ist, dem Skript eine Versionsnummer anzuhängen, bevor es die von mir angegebene ausführt.
Nachverfolgen:
Das Ausführen von Python von verschiedenen Standorten aus führt auch zu unterschiedlichem Verhalten
bash-3.2$ cd /usr/bin
bash-3.2$ ./python /usr/bin/xattr
bash-3.2$ cp python /tmp
bash-3.2$ cd /tmp
bash-3.2$ ./python /usr/bin/xattr
python version 2.7.10 can't run /usr/bin/xattr. Try the alternative(s):
/usr/bin/xattr-2.7 (uses python 2.7)
Run "man python" for more information about multiple version support in
Mac OS X.
Ich habe beide Dateien hier angehängt (https://gist.github.com/hotpxl/f16be705ac8b0cc6b7fbfe951cb68c7b)
Antwort1
Unter MacOS /usr/bin/python
gibt es keinen Python-Interpreter, sondern ein Programm namens „Versioner“, das versucht, die zu verwendende Version des Python-Interpreters auszuwählen.
Es führt auch Tricks aus, wie z. B. die Suche nach einem Skript mit einem Python-Versionssuffix beim Ausführen von Skripten von speziellen Speicherorten wie z . B. /usr/bin
.
Dies ist teilweise dokumentiert in derManpage für Python unter MacOS, obwohl dort keine genauen Details zur Suche nach Skripts mit dem Suffix erwähnt werden.
Siehe auchdieser Blog-BeitragDarin wird genau das gleiche Problem untersucht, das Sie haben, und es enthält eine ausführlichere Erklärung, einschließlich der Überprüfung der Binärdatei „Versioner“ auf der Suche nach speziellen Zeichenfolgen.