As variáveis de ambiente são uma lista de pares de name=value
que existem independentemente do programa (shell, aplicativo, daemon…). Eles são tipicamente herdados por processos filhos (criados por uma sequência fork
/ exec
): processos filhos obtêm sua própria cópia das variáveis pai.
As variáveis do shell existem apenas no contexto de um shell. Eles são herdados apenas em subshells (ou seja, quando o shell é bifurcado sem uma operação exec
). Dependendo dos recursos do shell, as variáveis podem não ser apenas strings simples, como as do ambiente, mas também arrays, variáveis tipadas, compostas, como inteiro ou ponto flutuante, etc.
Quando um shell é iniciado, todas as variáveis de ambiente herdadas de seu pai se tornam também variáveis de shell (a menos que sejam inválidas como variáveis de shell e outros casos como IFS
, que são redefinidas por alguns shells), mas essas variáveis herdadas são marcadas conforme exportado 1 . Isso significa que eles permanecerão disponíveis para processos filhos com o valor potencialmente atualizado definido pelo shell. Esse também é o caso de variáveis criadas sob o shell e marcadas como exportadas com a palavra-chave export
.
Matriz e outras variáveis do tipo complexo não podem ser exportadas, a menos que seu nome e valor possam ser convertidos para o padrão name=value
, ou quando um mecanismo específico do shell estiver em vigor (por exemplo: bash
exporta funções no ambiente e alguns exóticos , não cascas POSIX como rc
e es
podem exportar matrizes).
Assim, a principal diferença entre as variáveis de ambiente e as variáveis de shell é seu escopo: as variáveis de ambiente são globais, enquanto as variáveis de shell não exportadas são locais para o script.
Note também que os shells modernos (pelo menos ksh
e bash
) suportam um terceiro escopo de variáveis do shell. As variáveis criadas em funções com a palavra-chave typeset
são locais para essa função (A maneira como a função é declarada ativa / desativa esse recurso em ksh
e o comportamento de persistência é diferente entre bash
e ksh
). Consulte o link
1 Isso se aplica a shells modernos como ksh
, dash
, bash
e similares. As conchas de sintaxe de shell Bourne e não Bourne legadas como csh
têm comportamentos diferentes.