我正在運行 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 解釋器版本。
它還會執行一些技巧,例如在從特殊位置(例如/usr/bin
.
這部分記錄在MacOS 中的 python 手冊頁,儘管那裡沒有提到尋找帶有後綴的腳本的確切細節。
也可以看看這篇博文它探討了您遇到的完全相同的問題,並有更深入的解釋,包括檢查“版本控製程式”二進位以查找特殊字串。