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

15

Eu defini algumas variáveis de ambiente no meu .profile assim:

MY_HOME="/home/my_user"

mas a variável parece não avaliar a menos que eu retire aspas e reenvie o arquivo. Eu acredito que as aspas são necessárias se houver espaços, e aspas simples serão usadas se as fugas não forem desejadas. Alguém pode esclarecer o significado de aspas simples e duplas em definições de variáveis? Que tal carrapatos e carrapatos?

    
por 2NinerRomeo 09.07.2011 / 00:54

2 respostas

17

Eu acho que você está confuso sobre a terminologia.

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

O que você está fazendo no seu exemplo é criar uma variável 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 todas as shells (exceto csh, tcsh).

Neste caso particular, as aspas duplas são supérfluas. Eles não têm efeito. Aspas duplas de grupos, mas permite que qualquer shell que você use faça substituição de variável. Subtítulos de grupos de citações simples e impede a substituição. Como a sua atribuição de exemplo não tem nenhuma variável, as aspas duplas podem ter aparecido 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.

    
por 09.07.2011 / 01:34
16

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.

    
por 09.07.2011 / 01:29