Por que alguns scripts python começam com #! / usr / bin / env python? [duplicado]

30

Percebi que alguns scripts python começam com #!/usr/bin/env python em vez de #!/usr/bin/python .

Os scripts python são os únicos que usam #!/usr/bin/env ? Há algum script que comece com, por exemplo, #!/usr/bin/env bash ou #!/usr/bin/env perl ? Se não, por que os scripts python são diferentes?

    
por Linux Jedi 03.01.2016 / 10:29

3 respostas

41

Usando env no shebang de um script

Os scripts em Python não são diferentes dos scripts em nenhum outro idioma.

O uso de #!/usr/bin/env python ou #!/usr/bin/python desempenha um papel se o script for executável e chamado sem o idioma anterior. O script chama o interpretador da linguagem para executar o código dentro do script, e o shebang é o "guia" para encontrar, no seu exemplo, python .

Usando #!/usr/bin/env python em vez do absoluto (caminho completo) #!/usr/bin/python garante que o python (ou o interpretador de qualquer outro idioma) seja encontrado, caso ele não esteja exatamente no mesmo local em diferentes tipos de Linux ou Unix distribuições, como explicado, por exemplo aqui .

Embora #!/usr/bin/python funcione em um sistema padrão do Ubuntu, é uma boa prática usar #!/usr/bin/env python .

Sobre env

env é um executável em /usr/bin , ou /usr/bin to env , em praticamente todas as distribuições Linux.

Da Wikipédia :

env é um comando shell para sistemas operacionais Unix e Unix-like. Ele é usado para imprimir uma lista de variáveis de ambiente ou executar outro utilitário em um ambiente alterado sem precisar modificar o ambiente existente no momento. Usando env, as variáveis podem ser adicionadas ou removidas, e as variáveis existentes podem ser alteradas, atribuindo novos valores a elas.

e em relação à sua pergunta:

Na prática, env tem outro uso comum. É frequentemente usado por scripts de shell para iniciar o interpretador correto. Neste uso, o ambiente normalmente não é alterado

Mais sobre env encontra-se aqui e, como sempre, em man env (de um terminal).

Informações adicionais sobre o shebang; porque não funciona o #! python?

Em um comentário, foi perguntado por que não podemos simplesmente usar #!python como shebang. Como o intérprete está em $PATH , a ideia é compreensível.

O motivo é que um executável é executado por execve , pois podemos ler aqui . Especificamente as linhas:

Um script de intérprete é um arquivo de texto que tem permissão de execução ativada e cuja primeira linha é da forma:

#! interpreter [optional-arg]

O interpretador deve ser um caminho válido para um executável ....

explique que execve exige um caminho completo (válido) para o interpretador. Isso faz sentido, pois os scripts (em qualquer idioma) podem, por exemplo ser executado a qualquer momento durante a inicialização também, possivelmente antes de $PATH ser definido.

    
por Jacob Vlijm 03.01.2016 / 10:35
14

A resposta de Jacob explica bem. No entanto, há mais um ponto que gostaria de mencionar.

Usar /usr/bin/env/ em python serve mais uma finalidade. Como o python suporta ambientes virtuais , usar /usr/bin/env python garantirá que seus scripts sejam executados dentro do ambiente virtual, se você estiver dentro de um. Considerando que /usr/bin/python será executado fora do ambiente virtual.

    
por sid 03.01.2016 / 17:28
6

Além das respostas dadas acima, o uso de /usr/bin/env permite que o seu Python seja instalado em locais não padrão, e desde que o PATH esteja configurado corretamente, o script será executado sem modificação em qualquer Sistema de estilo UNIX que possui /usr/bin/env . Isso inclui qualquer versão moderna do Linux e do OS / X.

    
por YitzikC 03.01.2016 / 18:35