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 exportser 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=fooe export myvar, mas todos os shells modernos entendem export myvar=foo.
Você pode executar set -apara que todas as atribuições de variáveis do shell exportem automaticamente a variável, o que myvar=fooequivale a export myvar=foose você executou set -anesse 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=valuesintaxe simples quanto para o exportutilitário.
Há uma diferença entre a sintaxe da atribuição e a exportsintaxe. 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 myvarfor hello *, as echo $myvarimpressões serão helloseguidas 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=$myvarna verdade confiável copia o valor myvardaothervar, 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.