
Eu sei que isso VARIABLE=value
cria uma variável de ambiente e export VARIABLE=value
a disponibiliza para processos criados pelo shell atual. env
mostra 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 execve
pá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
environ
aponta para uma matriz de ponteiros para strings chamada "ambiente". O último ponteiro nesta matriz tem o valorNULL
. (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=value
cria uma variável de shell (na maioria dos shells). export SOME_NAME=value
cria 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/exec
método de iniciar um novo processo que todos os Unixes usam. Quando você export
cria 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 exec
comando 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 ulimit
configuraçõ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 exec
processo recém-criado.
Veja a bash
descriçã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 cd
em 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_PATH
ps -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 crontab
ou visudo
você pode definir a EDITOR
variá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 man
comando que analisa seu PAGER
ambiente 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 PATH
variá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_HOME
variá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
, HISTFILE
etc), 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... ↑