Estou executando o macOS High Sierra e descobri esse comportamento peculiar do sistema Python.
O mesmo /usr/bin/xattr
ocorre com um script Python que imprime uma mensagem de erro imediatamente e sai; e /usr/bin/xattr-2.7
é aquele que faz o verdadeiro trabalho do xattr.
Se eu executar /usr/bin/xattr
or xattr
or /usr/bin/python /usr/bin/xattr
, todos eles serão executados /usr/bin/xattr-2.7
em vez de /usr/bin/xattr
. Observe que não há como /usr/bin/xattr
redirecionar o controle para /usr/bin/xattr-2.7
. Ele imprime uma mensagem de erro imediatamente.
Mas se eu mudar o diretório para /usr/bin
e executar /usr/bin/python ./xattr
ou apenas ./xattr
, eles executarão o real /usr/bin/xattr
e imprimirão a mensagem de erro.
Então eu me pergunto que magia está envolvida aqui. Parece que o Python que vem pré-instalado é capaz de anexar o número da versão ao script antes de executar aquele que especifiquei.
Seguir:
Executar Python em locais diferentes também resultará em comportamentos diferentes
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.
Anexei os dois arquivos aqui (https://gist.github.com/hotpxl/f16be705ac8b0cc6b7fbfe951cb68c7b)
Responder1
No MacOS, /usr/bin/python
não é um interpretador Python, mas sim um programa chamado "versionador" que tentará selecionar qual versão do interpretador Python usar.
Ele também fará truques como procurar um script nomeado com um sufixo de versão Python ao executar scripts em locais especiais, como /usr/bin
.
Isto está parcialmente documentado nopágina de manual para python no MacOS, embora os detalhes exatos da procura de scripts com o sufixo não sejam mencionados lá.
Veja tambémesta postagem do blogque explora exatamente o mesmo problema que você está enfrentando e tem uma explicação mais aprofundada, incluindo a inspeção do binário "versionador" em busca de strings especiais.