O que o comando está env ls -al
fazendo?
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 info
e man
sobre env
, mas não entendeu muito.
O que está env
fazendo e exatamente env <command>
sem argumentos para env
si mesmo?
shell
command-line
command
env
ALZ
fonte
fonte
env <command>
,command <command>
e\<command>
. Na minha opinião, se algum teste ditoenv <command>
for inválido, esse teste será interrompido.command
ou oenv
que tornaria `\` a única resposta aceitável.man
e não entendi o queenv
exatamente estava fazendo. Após este post, fica claro e minha resposta foi revisada (aceita). Obrigado a todos!Respostas:
Este comando
executa o comando
program and args
com um ambiente formado estendendo o ambiente atual com as variáveis e valores do ambiente designados porname=value
ename2=value2
. Se você não incluir argumentos como essename=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 arguments
para exec (como execvp , que procurará no PATHprogram
).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 emenv
ser um apelido, pode especificar o caminho completo (por exemplo/usr/bin/env
, embora possa variar).fonte
Outro uso importante de
env
(além de contornar a pesquisa de alias de comando) é que ele procuraPATH
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
está bom, enquanto#!bash
não, apesar de/bin
ser incluído noPATH
sistema razoável.Eu encontrei isso com frequência em programas Python, que geralmente começam com o
#!/usr/bin/env python
objetivo de evitar a especificação do caminho completo e dependente do sistema dopython
executável (observe, no entanto, que ainda é necessário que eleenv
resida/usr/bin
, isso é muito mais comum do que a localização do python binário).fonte