O que exatamente é uma variável de ambiente?

O que exatamente é uma variável de ambiente?

Eu sei que isso VARIABLE=valuecria uma variável de ambiente e export VARIABLE=valuea disponibiliza para processos criados pelo shell atual. envmostra as variáveis ​​de ambiente atuais, mas onde elas residem? O que compreende uma variável de ambiente (ou umambiente, aliás)?

Responder1

Um ambiente não é tão mágico quanto pode parecer. O shell armazena na memória e passa para a execve()chamada do sistema. O processo filho o herda como um ponteiro de array chamado environ. Na execvepágina de manual:

SINOPSE

   #include <unistd.h>

   int execve(const char *filename, char *const argv[],
              char *const envp[]);

argvé uma matriz de strings de argumentos passadas para o novo programa.
Por convenção, a primeira dessas strings deve conter o nome do arquivo associado ao arquivo que está sendo executado. envpé uma matriz de strings, convencionalmente no formato key=value, que são passadas como ambiente para o novo programa.

A environ(7)página de manual também oferece algumas dicas:

SINOPSE

   extern char **environ;

DESCRIÇÃO

A variável environaponta para uma matriz de ponteiros para strings chamada "ambiente". O último ponteiro nesta matriz tem o valor NULL. (Esta variável deve ser declarada no programa do usuário, mas é declarada no arquivo de cabeçalho <unistd.h>caso os arquivos de cabeçalho venham de libc4 ou libc5, e caso venham de glibc e _GNU_SOURCE tenha sido definido.) Este array de strings é disponibilizado para o processo pela chamada exec(3) que iniciou o processo.

Ambas as páginas de manual do GNU correspondem aoEspecificação POSIX

Responder2

Você entendeu um pouco errado: SOME_NAME=valuecria uma variável de shell (na maioria dos shells). export SOME_NAME=valuecria uma variável de ambiente. Para o bem ou para o mal, a maioria dos shells Unix/Linux/*BSD usam sintaxe idêntica para acessar variáveis ​​de ambiente e variáveis ​​de shell.

Num sentido mais amplo, um “ambiente” é apenas a informação que acompanha a execução do programa. Em programas C, você pode encontrar o ID do processo com uma getpid()chamada; em um programa shell, você usaria um acesso variável: $$. O ID do processo é apenas parte do ambiente do programa. Acredito que o termo "ambiente" venha de alguns dos tópicos mais teóricos da ciência da computação, como modelagem de execução de programas.ambiente“que contém as associações entre variáveis ​​e seus valores”.

E esta última definição mais forte é o que é um "ambiente" para shells Unix/Linux/*BSD: uma associação entre nomes ("variáveis") e seus valores. Para a maioria dos shells no estilo Unix, os valores são todos cadeias de caracteres, embora isso não seja tão estritamente verdadeiro como costumava ser. Ksh, Zsh e Bash têm variáveis ​​digitadas atualmente. Até mesmo definições de funções shell podem ser exportadas.

O uso de um ambiente separado das variáveis ​​​​de shell simples envolve o fork/execmétodo de iniciar um novo processo que todos os Unixes usam. Quando você exportcria um par nome/valor, esse par nome/valor estará presente no ambiente de novos executáveis, iniciados pelo shell com uma execve(2)chamada de sistema (geralmente após um fork(2), exceto quando o execcomando shell foi usado).

Seguindo um execve(), a main()função do novo binário tem seus argumentos de linha de comando, o ambiente (armazenado como uma matriz de ponteiros para strings terminada em NULL var=value, consulte a environ(7)página de manual). Outro estado herdado inclui ulimitconfigurações, diretório de trabalho atual e quaisquer descritores de arquivo abertos para os quais o execve()chamador não tinha FD_CLOEXEC definido. O estado atual do tty (eco ativado, modo bruto, etc.) também pode ser considerado parte do estado de execução herdado por um execprocesso recém-criado.

Veja a bashdescrição do manual doambiente de execuçãopara comandos simples (exceto funções internas ou shell).

O ambiente Unix é diferente de pelo menos alguns outros sistemas operacionais: os "léxicos" do VMS podem ser alterados por um processo filho, e essa mudança é visível no pai. Um VMS cdem um processo filho afetaria o diretório de trabalho do pai. Pelo menos em algumas circunstâncias, e minha memória pode estar falhando.

Algumas variáveis ​​de ambiente são bem conhecidas, $HOME, e outras. Alguns são convencionais para um determinado sistema de programação, de modo que um shell pai pode passar muitas e muitas informações de propósito especial para algum programa, como um diretório temporário específico ou um ID de usuário e senha que não aparecem no arquivo . Programas CGI simples herdam muitas informações do servidor web por meio de variáveis ​​de ambiente, por exemplo.$PATH$LD_LIBRARY_PATHps -ef

Responder3

Variáveis ​​de ambiente em sua forma mais bruta são apenas um conjunto de pares nome/valor. Conforme descrito na página man do bash ( man 1 bash) na seção MEIO AMBIENTE:

   When  a  program  is invoked it is given an array of strings called the
   environment.   This  is  a  list  of  name-value  pairs,  of  the  form
   name=value.

   The  shell  provides  several  ways  to manipulate the environment.  On
   invocation, the shell scans its own environment and creates a parameter
   for  each name found, automatically marking it for export to child pro-
   cesses.  Executed commands inherit the  environment.

Em termos práticos, permite definir um comportamento compartilhado ou exclusivo para programas invocados a partir do shell atual. Por exemplo, ao usar crontabou visudovocê pode definir a EDITORvariável de ambiente para definir outro editor diferente daquele que seu sistema usaria por padrão. O mesmo pode ser verdadeiro para coisas como o mancomando que analisa seu PAGERambiente para descobrir qual programa de pager deve ser usado para exibir a saída da página de manual.

Muitos comandos unix leem o ambiente e dependendo do que está definido alteram sua saída/processamento/ação dependendo deles. Alguns são compartilhados, alguns são exclusivos do programa. A maioria das páginas de manual contém informações sobre como a variável de ambiente afeta o programa descrito.

Outras ilustrações práticas são para sistemas com diversas instalações do Oracle na mesma plataforma. Ao definir ORACLE_HOME, todo o conjunto de comandos Oracle (conforme carregado a partir de sua PATHvariável de ambiente) extrai configurações, definições, mapeamentos e bibliotecas desse diretório de nível superior. O mesmo vale para outros programas como Java com sua JAVA_HOMEvariável de ambiente.

O próprio bash tem muitas variáveis ​​de ambiente que podem alterar o comportamento de uma série de coisas, desde histórico ( HISTSIZE, HISTFILEetc), tamanho da tela ( COLUMNS), conclusão de tabulação ( FIGNORE, GLOBIGNORE) localidade e codificação/decodificação de caracteres ( LANG, LC_*), prompt ( PS1.. PS4) e assim por diante (novamente busque conhecimento na página de manual do bash).

Além disso, você pode escrever scripts/programas que fazem uso de suas próprias variáveis ​​de ambiente personalizadas (para passar configurações ou alterar funcionalidades).

Responder4

"Variáveis ​​ambientais"são um conjunto de valores nomeados dinâmicos que podem afetar a maneira como os processos em execução se comportarão em um computador.

Eles fazem parte do ambiente operacional no qual um processo é executado. Por exemplo, um processo em execução pode consultar o valor da variável de ambiente TEMP para descobrir um local adequado para armazenar arquivos temporários, ou a variável HOME ou USERPROFILE para encontrar a estrutura de diretórios pertencente ao usuário que está executando o processo.

Mais informações aqui →http://en.wikipedia.org/wiki/Environment_variable.

Tudo o que você quer saber sobre variáveis ​​de ambiente... ↑

informação relacionada