Qual é o significado de aspas simples e duplas em variáveis ​​de ambiente?

19

Eu defini algumas variáveis ​​de ambiente no meu .profile como este:

MY_HOME="/home/my_user"

mas a variável parece não ser avaliada, a menos que retire as aspas e reenvie o arquivo. Acredito que as aspas sejam necessárias se houver espaços, e aspas simples serão usadas se não forem necessárias escapadas. Alguém pode esclarecer o significado das aspas simples e duplas nas definições de variáveis? E os ticks anteriores e posteriores?

2NinerRomeo
fonte

Respostas:

23

Eu acho que você está confuso sobre terminologia.

Uma "variável de ambiente" é apenas uma variável de shell que qualquer processo filho herdará.

O que você está fazendo no seu exemplo é criar uma variável de shell. Não está no ambiente até você exportá-lo:

MY_HOME="/home/my_user"
export MY_HOME

coloca uma variável chamada "MY_HOME" em quase todos os shells (exceto csh, tcsh).

Nesse caso específico, as aspas duplas são supérfluas. Eles não têm efeito. Aspas de grupo de aspas duplas, mas permitem que qualquer shell que você use faça a substituição de variáveis. A aspas simples agrupa substrings e impede a substituição. Como a atribuição de exemplo não possui variáveis, as aspas duplas podem aparecer como aspas simples.

V='some substrings grouped together'  # assignment
X="Put $V to make a longer string"    # substitution and then assignment
Y=`date`                              # run command, assign its output
Z='Put $V to make a longer string'    # no substition, simple assignment

Nada está no ambiente até você exportá-lo.

Bruce Ediger
fonte
18

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.

Gilles 'SO- parar de ser mau'
fonte
Você pode explicar "A citação é principalmente ortogonal". na seção "Ao citar"? Não entendo o significado de ortogonal nessa frase.
Justice for Monica
11
@DKBose Significa que as variáveis ​​de ambiente versus shell, por um lado, e citações, por outro lado, são dois problemas separados que têm pouco a ver um com o outro. Wikcionário, significados 4 e 5.
Gilles 'SO- stop be evil'