/usr/bin/python 在 macOS 上运行不同版本的脚本

/usr/bin/python 在 macOS 上运行不同版本的脚本

我正在运行 macOS High Sierra 并发现系统 Python 存在这种奇怪的行为。

因此/usr/bin/xattr是一个立即打印错误消息并退出的 Python 脚本;并且/usr/bin/xattr-2.7是执行真正的 xattr 工作的脚本。

如果我运行/usr/bin/xattrxattr/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 的手册页,尽管那里没有提到寻找带有后缀的脚本的具体细节。

也可以看看这篇博文它探讨了您所遇到的完全相同的问题,并提供了更深入的解释,包括检查“版本控制程序”二进制文件以查找特殊字符串。

相关内容