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

Recentemente, percebi 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, esclareça-nos.

Quando devo preferir uma em vez da outra? Por favor, sugira diretrizes.

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

Já percebi isso responda , mas desejo expandir a pergunta com env e diretrizes de preferência de uso.

Resposta

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

Pré-POSIX Os shells Bourne não suportavam isso, por isso você” verá scripts que evitam export VARIABLE_NAME="some value" e usam VARIABLE_NAME="some value"; export VARIABLE_NAME em vez disso. Mas shells Bourne pré-POSIX são extremamente raros hoje em dia.

setenv VARIABLE_NAME="some value" é a sintaxe csh para definir uma variável de ambiente. setenv nã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 zsh por ainda mais tempo), então você pode esquecê-lo a menos você o encontra.

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

Resposta

Definindo uma variável como VAR="asdf" deixa o ambiente inalterado, o que significa que os programas que você iniciar na mesma sessão não saberão nada sobre VAR e não poderão acessá-lo. Você deseja este comportamento ao escrever scripts de shell .

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

env não é embutido, mas um programa por si só. a superfície funciona exatamente como quando você VAR="asdf" %program_name%, mas no nível inferior as coisas ficam um pouco mais complicadas. Primeiro, o env é iniciado. Ele modifica o ambiente e, em seguida, 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 export em shells csh-family, conforme declarado em sua resposta.

Comentários

  • Em shells modernos, VAR=asdf atualiza o ambiente se VAR já estiver no ambiente. (Isso não era ' verdade no shell Bourne original.)

Resposta

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *