我正在运行 macOS High Sierra 并发现系统 Python 存在这种奇怪的行为。
因此/usr/bin/xattr
是一个立即打印错误消息并退出的 Python 脚本;并且/usr/bin/xattr-2.7
是执行真正的 xattr 工作的脚本。
如果我运行/usr/bin/xattr
或xattr
或/usr/bin/python /usr/bin/xattr
,它们都会运行,/usr/bin/xattr-2.7
而不是/usr/bin/xattr
。请注意,没有办法/usr/bin/xattr
将控制重定向到/usr/bin/xattr-2.7
。它会立即打印错误消息。
但是如果我将目录更改为/usr/bin
并运行/usr/bin/python ./xattr
或只是./xattr
,它们将运行实际/usr/bin/xattr
并打印错误消息。
所以我想知道这里面有什么魔法。感觉就像是预装的 Python 能够在执行我指定的脚本之前将版本号附加到脚本中。
跟进:
从不同位置运行 Python 也会导致不同的行为
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.
我已将两个文件附加在此处(https://gist.github.com/hotpxl/f16be705ac8b0cc6b7fbfe951cb68c7b)
答案1
在 MacOS 中,/usr/bin/python
没有 Python 解释器,而是一个名为“versioner”的程序,它会尝试选择使用哪个版本的 Python 解释器。
当从特殊位置(例如)运行脚本时,它还会做一些技巧,比如查找以 Python 版本后缀命名的脚本/usr/bin
。
这部分记录在MacOS 中 Python 的手册页,尽管那里没有提到寻找带有后缀的脚本的具体细节。
也可以看看这篇博文它探讨了您所遇到的完全相同的问题,并提供了更深入的解释,包括检查“版本控制程序”二进制文件以查找特殊字符串。