o que o comando 'env' está fazendo?

34

Qual é o comando env ls -al fazendo?

Eu tive um teste do Linux e havia uma pergunta: "Como executar o comando diretamente, mas não o seu alias?"
Eu sabia que existe solução como prefixar o comando com algum símbolo especial, mas esqueci. Agora eu sei que é \ . (leia de este post ).

Mas também lembro que, em algum lugar, li que para eliminar o alias, podemos prefixar um comando com env . Eu fiz isso e parece funcionar, mas minha resposta foi qualificada como errada. Eu li info e man em env , mas não entendi muito.

O que env está fazendo e exatamente em env <command> sem nenhum argumento para env ?

    
por ALZ 03.12.2013 / 09:23

2 respostas

35

Este comando

env name=value name2=value2 program and args

executa o comando program and args com um ambiente formado pela extensão do ambiente atual com as variáveis de ambiente e valores designados por name=value e name2=value2 . Se você não incluir argumentos como name=value , o ambiente atual será transmitido sem modificações.

A principal coisa que acontece com relação aos aliases é que env é um comando externo, portanto, não tem "conhecimento" de aliases: aliases são uma construção de shell que não fazem parte do processo normal modelar e não ter impacto em programas que são executados diretamente por programas não-shell (como env ). env simplesmente passa o program and arguments para uma chamada exec (como execvp , que pesquisará o PATH por program ).

Basicamente, usar env como esta é uma maneira (principalmente) independente de shell de evitar aliases, funções de shell, comandos internos do shell e quaisquer outros bits de funcionalidade do shell que possam substituir ou substituir comandos argumentos de posição (ou seja, nomes de programas) - a menos que, é claro, env seja um alias ou uma função shell! Se você estiver preocupado com env ser um alias, poderá soletrar o caminho completo (por exemplo, /usr/bin/env , embora possa variar).

    
por 03.12.2013 / 10:47
23

Outro uso importante de env (além da pesquisa de alias de comando contornando) é que ele procura o PATH para o comando. Isso é importante quando caminhos absolutos são necessários, mas variam de sistema para sistema.

Por exemplo, iniciar um script Bash com #!/bin/bash é bom, enquanto #!bash não é, apesar de /bin ser incluído no PATH em todos os sistemas razoáveis.

Eu freqüentemente encontrei isso em programas em Python, que geralmente começam com #!/usr/bin/env python para evitar especificar o caminho completo, dependente do sistema, do executável python (observe, no entanto, que ainda requer que env resida em /usr/bin , isso é muito mais comum que o local do python binário).

    
por 03.12.2013 / 11:58