Qual é a diferença entre env, setenv, export e when to use?

9

Recentemente, notei que temos três opções para definir variáveis de ambiente:

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

Se houver outras formas, por favor, nos ilumine.

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

Quanto à compatibilidade de shell, qual é a mais expansiva (abrange mais dialetos de shell)?

Eu já notei esta resposta mas desejo expanda a pergunta com env e as diretrizes de preferência de uso.

    
por Maroshi 03.06.2017 / 08:48

3 respostas

6

export VARIABLE_NAME='some value' é o caminho para 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ê pode usar export VARIABLE_NAME para torná-la uma variável de ambiente sem alterar seu valor.

Pré-POSIX Bourne shells não suportam isso, e é por isso que você verá scripts que evitam export VARIABLE_NAME='some value' e use VARIABLE_NAME='some value'; export VARIABLE_NAME . Mas as cápsulas 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. Ao contrário de sh, setenv VARIABLE_NAME . setenv não existe em sh, e csh é extremamente raramente usado em scripts e foi ultrapassado pelo bash para uso interativo nos últimos 20 anos (e zsh por mais tempo), então você pode esquecê-lo a menos que você o encontre.

O comando env é muito raramente útil, exceto em linhas shebang . Quando invocado sem argumentos, ele exibe o ambiente, mas export o faz melhor (classificado e frequentemente cotado para desambiguar novas linhas em valores de novas linhas que separam valores. Quando invocado com argumentos, ele executa um comando com variáveis de ambiente extras, mas o o mesmo comando sem env também funciona ( VAR=value mycommand runs mycommand com VAR definido como value , assim como env VAR=value mycommand ). O motivo env é útil na linha shebang porque ele executa PATH lookup, e acontece de não fazer mais nada quando invocado com um nome de comando.O comando env 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.

    
por 04.06.2017 / 01:46
2

A definição de 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 sobre VAR e não poderão acessá-lo. Você quer 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 processos filhos gerados na sessão atual. Você pode conseguir o mesmo executando VAR='asdf' %program_name% .

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

setenv é apenas export em shells da família csh, conforme indicado na sua resposta.

    
por 03.06.2017 / 09:06