Recentemente, percebi que temos 3 opções para definir variáveis de ambiente:
-
export envVar1=1
-
setenv envVar2=2
-
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
Resposta
Existem várias perguntas com respostas que respondem a isto:
-
Diferença entre as variáveis do shell que são exportadas e aquelas que não estão no bash
-
Qual é a diferença no uso entre variáveis de shell e variáveis de ambiente?
(etc.)
VAR=asdf
atualiza o ambiente seVAR
já estiver no ambiente. (Isso não era ' verdade no shell Bourne original.)