Qual é a diferença entre env, setenv, export e quando usar?

18

Recentemente notei que temos 3 opções para definir variáveis ​​de ambiente:

  1. export envVar1=1
  2. setenv envVar2=2
  3. env envVAr3=3

Se houver outras maneiras, por favor nos esclareça.

Quando devo preferir um ao outro? Por favor, sugira diretrizes.

Quanto à compatibilidade do shell, qual é o mais expansivo (abrange mais dialetos do shell)?

Eu já percebi essa resposta, mas desejo expandir a pergunta com envas diretrizes de preferência de uso.

Maroshi
fonte

Respostas:

14

export VARIABLE_NAME='some value'é a forma de definir uma variável de ambiente em qualquer shell compatível com POSIX ( sh, dash, bash, ksh, etc .; também zsh). Se a variável já tiver um valor, você poderá usá export VARIABLE_NAME-la para torná-la uma variável de ambiente sem alterar seu valor.

Os shells Bourne pré-POSIX não suportam isso, e é por isso que você verá scripts que evitam export VARIABLE_NAME='some value'e usam VARIABLE_NAME='some value'; export VARIABLE_NAME. Mas as conchas Bourne pré-POSIX são extremamente raras hoje em dia.

setenv VARIABLE_NAME='some value'é a sintaxe csh para definir uma variável de ambiente. setenvnão existe no sh, e o csh é extremamente raramente usado em scripts e foi superado pelo bash para uso interativo nos últimos 20 anos (e no zsh por mais tempo), para que você possa esquecê-lo, a menos que o encontre.

O envcomando raramente é útil, exceto nas linhas shebang . Quando invocado sem argumentos, ele exibe o ambiente, mas exportmelhora (classificado e frequentemente citado para desambiguar novas linhas em valores e novas linhas que separam valores). Quando invocado com argumentos, ele executa um comando com variáveis ​​de ambiente extras, mas o mesmo comando sem envtambém funciona ( VAR=value mycommandé executado mycommandcom VARset para value, assim como env VAR=value mycommand). O motivo envé útil na linha shebang é que ele executa a PATHpesquisa e, por acaso, não faz mais nada quando chamado com um nome de comando. O envcomando pode ser útil para executar um comando com apenas algumas variáveis ​​de ambiente com-i, ou sem parâmetros para exibir o ambiente, incluindo variáveis ​​com nomes inválidos que o shell não importa.

Gilles 'SO- parar de ser mau'
fonte
3

Definir uma variável como VAR='asdf'deixa o ambiente inalterado, o que significa que os programas iniciados na mesma sessão não saberão nada VARe não poderão acessá-lo. Você deseja esse comportamento ao escrever scripts de shell.

export, por outro lado, é um bash interno que modifica o ambiente, tornando a variável exportada visível para os processos filhos gerados na sessão atual. Você pode conseguir o mesmo executando VAR='asdf' %program_name%.

envnão é um builtin, mas um programa por si só. Na superfície, funciona exatamente como quando você VAR='asdf' %program_name%, mas no nível inferior, as coisas ficam um pouco mais complicadas. Primeiro, envé lançado. Ele modifica o ambiente e depois executa o comando com os argumentos fornecidos. O mesmo comportamento que você pode obter em seu próprio código usando a chamada de sistema exec (3) .

setenvé apenas exportnas conchas da família csh, como indicado na sua resposta.

user230253
fonte
2
Nas conchas modernas, VAR=asdfatualiza o ambiente se VARjá estava no ambiente. (Isso não era verdade na concha original de Bourne.)
Gilles 'pára de ser mau' em