Variáveis do shell vs. variáveis de ambiente
MY_HOME="/home/my_user"
define a variável do shell chamada MY_HOME
. Os 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 da variável, por exemplo, com echo "$MY_HOME"
.
Variáveis de shell são um conceito interno de shell. Quando essa instância do shell termina, MY_HOME
é esquecida. O que todo programa conhece e transmite para 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ê a exportar .
export MY_HOME="/home/my_user"
Mais detalhes que você pode pular na primeira leitura
A razão pela qual as variáveis do shell não se tornam variáveis de ambiente automaticamente é em parte que um script pode acidentalmente usar um nome de variável que seja significativo para um programa que ele lança e em parte apenas histórico.
Alguns shells muito antigos precisam export
ser usados sempre que você altera o nome de uma variável, mas todos os shells modernos mantêm o controle de atribuições para variáveis de ambiente, para que o seguinte snippet ecoa bar
:
myvar=foo
export myvar
myvar=bar
env | grep '^myvar='
Além disso, alguns shells muito antigos exigiam comandos separados para myvar=foo
e export myvar
, mas todos os shells modernos entendem export myvar=foo
.
Você pode executar set -a
para que todas as atribuições de variáveis do shell exportem automaticamente a variável, o que myvar=foo
equivale a export myvar=foo
se você executou set -a
nesse shell primeiro.
Ao citar
A citação é principalmente ortogonal. Se o valor que você está atribuindo à variável não contiver caracteres especiais para o shell, você não precisará de aspas. Se houver caracteres especiais, você precisará protegê-los com aspas simples ou duplas ou barras invertidas ou uma combinação delas. Isso vale tanto para a myvar=value
sintaxe simples quanto para o export
utilitário.
Há uma diferença entre a sintaxe da atribuição e a export
sintaxe. O shell expande ainda mais os resultados das substituições de variáveis $foo
, realizando divisão de campo (palavra) e expansão de nome de caminho (globbing) . Isso significa que, se o valor de myvar
for hello *
, as echo $myvar
impressões serão hello
seguidas 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 em torno substituições de variáveis (a menos que você sabe que você precisa pathname expansão ou divisão de campo): echo "$myvar"
. No caso de uma atribuição simples, othervar=$myvar
na verdade confiável copia o valor myvar
daothervar
, porque o globbing e a divisão de palavras são inibidos nas atribuições (porque criam várias palavras, mas uma única palavra é esperada). Esta dispensação não se aplica export
, no entanto. Portanto, se você quiser se lembrar de uma regra simples, sempre use aspas duplas em torno das substituições de variáveis.