/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 解釋器版本。

它還會執行一些技巧,例如在從特殊位置(例如/usr/bin.

這部分記錄在MacOS 中的 python 手冊頁,儘管那裡沒有提到尋找帶有後綴的腳本的確切細節。

也可以看看這篇博文它探討了您遇到的完全相同的問題,並有更深入的解釋,包括檢查“版本控製程式”二進位以查找特殊字串。

相關內容