Variáveis da shell vs. variáveis de ambiente
MY_HOME="/home/my_user"
define a variável de shell chamada %código%. Shells são linguagens de programação e possuem variáveis (também chamadas de parâmetros). Após esta atribuição, você pode usar o valor do
variável, por ex. com MY_HOME
.
As variáveis do shell são um conceito de shell interno. Quando essa instância de shell termina, echo "$MY_HOME"
é esquecido. O que todo programa conhece e transmite aos seus filhos são variáveis de ambiente .
Dentro do shell, variáveis de ambiente e variáveis de shell funcionam de maneiras muito semelhantes. O que realmente acontece é que todas as variáveis de ambiente que o shell herda de seu pai se tornam variáveis do shell. Por outro lado, uma variável de shell definida em um script de shell se tornará uma variável de ambiente se você exportar .
export MY_HOME="/home/my_user"
Mais detalhes que você pode pular na primeira leitura
O motivo pelo qual as variáveis de shell não se tornam automaticamente variáveis de ambiente é, em parte, que um script pode acidentalmente usar um nome de variável que seja significativo para um programa que seja iniciado e parcialmente apenas histórico.
Alguns shells muito antigos exigiam que MY_HOME
fosse usado toda vez que você alterava o nome de uma variável, mas todos os shells modernos rastreavam atribuições para variáveis de ambiente, para que o seguinte trecho ecoasse export
:
myvar=foo
export myvar
myvar=bar
env | grep '^myvar='
Além disso, alguns shells muito antigos requerem comandos separados para bar
e myvar=foo
, mas todos os shells modernos entendem export myvar
.
Você pode executar export myvar=foo
para fazer com que todas as atribuições de variáveis do shell exportem automaticamente a variável, para que set -a
seja equivalente a myvar=foo
se você executou export myvar=foo
nesse shell primeiro.
Ao citar
As citações são principalmente ortogonais. Se o valor que você está atribuindo à variável não contiver nenhum caractere especial para o shell, você não precisará de nenhuma aspas. Se houver caracteres especiais, você precisará protegê-los com aspas simples ou aspas duplas ou barras invertidas ou uma combinação delas. Isso vale para a sintaxe simples set -a
e o utilitário myvar=value
.
Existe uma diferença entre a sintaxe de atribuição e a sintaxe export
. O shell expande ainda mais os resultados das substituições de variáveis export
, executando divisão de campo (palavra) e expansão do nome do caminho (globbing) . Isso significa que se o valor de $foo
for myvar
, então hello *
imprimirá echo $myvar
seguido por um único espaço seguido pela lista de arquivos no diretório atual. Isso quase nunca é desejável, portanto, o princípio geral de sempre usar aspas duplas em torno das substituições de variáveis (a menos que você saiba que precisa da expansão do nome do caminho ou da divisão do campo): hello
. No caso de uma atribuição simples, echo "$myvar"
copia de forma confiável o valor de othervar=$myvar
para myvar
, porque globbing e divisão de palavras são inibidas em atribuições (porque elas criam várias palavras, mas uma única palavra é esperada). Esta dispensação não se aplica a othervar
, no entanto. Então, se você quiser lembrar de uma regra simples, use sempre aspas duplas em torno de substituições de variáveis.