Existe alguma garantia de que / usr / bin / env existirá?

7

Frequentemente, os scripts começam com uma linha shebang que usa #!/usr/bin/env interpreter_name para qualquer interpretador, com a justificativa de que diferentes sistemas podem ter o interpretador necessário para serem executados em locais diferentes. Por exemplo, se eu assumir que python está instalado como /usr/bin/python , algum usuário que decidiu instalá-lo como /opt/python por algum motivo não poderá usá-lo tão facilmente.

Mas a pergunta óbvia é: há alguma garantia de que env será instalado em /usr/bin/env (ou, em qualquer lugar específico), ou isso é apenas um caso de "mover o problema", por assim dizer?

Esta questão ligeiramente relacionada foi um comentário que diz que é uma má idéia e é preferível instalá-lo com o caminho real do interpretador e cita a especificação única do unix, mas não aborda realmente essa questão.

    
por scott_fakename 31.01.2014 / 06:19

1 resposta

6

Não, env não é garantido como /usr/bin , como você pode ler no histórico do mecanismo shebang , na seção "O utilitário env":

However, the location of env(1) might vary. Free-, Net-, OpenBSD and some Linux distributions (e.g. Debian) only come with /usr/bin/env. On the other hand, there's only /bin/env at least on SCO OpenServer 5.0.6 and Cray Unicos 9.0.2 (although the latter is only of historical interest). On some other Linux distributions (Redhat) it's located in /bin and /usr/bin/ contains a symbolic link pointing to it.

Ele não move completamente o problema, devido à flexibilidade de env pesquisar $PATH . Se acontecer de você obter alguns scripts que usam um local diferente para env do seu, você somente precisa saber onde seu env está, e não onde perl , python e outros intérpretes podem ser instalados.

E você não precisa codificar /opt/python/3.3.2/bin/python3.3 se esse for o primeiro executável python3.3 em seu PATH. Você pode confiar apenas em env para encontrá-lo, assim você não precisa atualizar cada script se você atualizar para usar /opt/python/3.3.3/bin/python3.3. Seu cabeçalho de script permanece o mesmo:

#! /usr/bin/env python3.3
    
por 31.01.2014 / 06:51

Tags