o que `env <comando>` está fazendo?

37

O que o comando está env ls -alfazendo?

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

Mas também me lembro que em algum lugar li que, para se livrar do alias, podemos prefixar um comando env. Eu fiz isso e parece funcionar, mas minha resposta foi qualificada como errada. Eu li infoe mansobre env, mas não entendeu muito.

O que está envfazendo e exatamente env <command>sem argumentos para envsi mesmo?

ALZ
fonte
Como uma nota, 3 maneiras de fazer isso que eu posso pensar são env <command>, command <command>e \<command>. Na minha opinião, se algum teste dito env <command>for inválido, esse teste será interrompido.
Patrick
@ Patrick: Não está quebrado porque, como Chris disse, poderia haver um apelido commandou o envque tornaria `\` a única resposta aceitável.
Pierre Arlaud
11
@ArlaudPierre e `\` não são definidos no posix (como uma fuga de apelido), portanto, não é portátil. Portanto, não é mais aceitável que os outros.
Patrick
@ Patrick: verdadeiro, verdadeiro. Agora teríamos que saber o perímetro exato do teste para dizer isso. Mas, em qualquer caso, descubra que a resposta "env" não é aceitável e não é muito honesta, eu teria que concordar com você sobre isso.
Pierre Arlaud
Pessoal, o teste também foi verificado por humanos (ex-administrador de sistema certificado pela LPI, que agora ensina outros Linux) :) Reclamei para o verificador, fui mane não entendi o que envexatamente estava fazendo. Após este post, fica claro e minha resposta foi revisada (aceita). Obrigado a todos!
ALZ 3/13/13

Respostas:

38

Este comando

env name=value name2=value2 program and args

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

O principal que acontece com relação aos aliases é que env é um comando externo, portanto, ele não tem "conhecimento" de aliases: aliases são uma construção de shell que não fazem parte do modelo de processo normal e não têm impacto em programas diretamente executado por programas não-shell (como env ). env simplesmente passa a chamada program and argumentspara exec (como execvp , que procurará no PATH program).

Basicamente, usar env como este é uma maneira (principalmente) independente do shell de evitar aliases, funções do shell, comandos internos do shell e quaisquer outros bits da funcionalidade do shell que possam substituir ou substituir argumentos de posição de comando (ou seja, nomes de programas) - a menos que envé claro, é um apelido ou função de shell! Se você está preocupado em envser um apelido, pode especificar o caminho completo (por exemplo /usr/bin/env, embora possa variar).

Chris Johnsen
fonte
24

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

Por exemplo, iniciar um script Bash com #!/bin/bashestá bom, enquanto #!bashnão, apesar de /binser incluído no PATHsistema razoável.

Eu encontrei isso com frequência em programas Python, que geralmente começam com o #!/usr/bin/env pythonobjetivo de evitar a especificação do caminho completo e dependente do sistema do pythonexecutável (observe, no entanto, que ainda é necessário que ele envresida /usr/bin, isso é muito mais comum do que a localização do python binário).

misberner
fonte