Quais caracteres são permitidos nos nomes de variáveis de ambiente Linux? Minha pesquisa superficial das páginas de manual e da Web produziu apenas informações sobre como trabalhar com variáveis, mas não quais nomes são permitidos.
Eu tenho um programa Java que requer uma variável de ambiente definida contendo um ponto, como com.example.fancyproperty
. No Windows, posso definir essa variável, mas não tive sorte em defini-la no linux (tentei no SuSE e no Ubuntu). Esse nome de variável é permitido?
linux
syntax
environment-variables
Christian Semrau
fonte
fonte
-D
opção de linha de comando), então funciona agora. Obviamente, o programa procura nos dois conjuntos de variáveis sem me informar. Mas ainda estou curioso sobre quais nomes de variáveis de ambiente são permitidos.com_example_fancyproperty
eCOM_EXAMPLE_FANCYPROPERTY
.Respostas:
Do Grupo Aberto :
Portanto, os nomes podem conter qualquer caractere, exceto = e NUL, mas:
Portanto, embora os nomes possam ser válidos, seu shell pode não suportar nada além de letras, números e sublinhados.
fonte
[a-zA-Z_][a-zA-Z0-9_]*
(sugerindo implicitamente que este formulário é mais saudável), mas a especificação real (cotação 1) requer toda a implementação para oferecer suporte a qualquer coisa, exceto=
eNUL
?A seção de padrões POSIX em conchas do padrão IEEE 1003.1-2008 / IEEE POSIX P1003.2 / ISO 9945.2 Shell e Ferramentas não define a convenção lexical para nomes de variáveis, no entanto, uma análise superficial da fonte revela que ele usa algo semelhante a
[a-zA-Z_]+[a-zA-Z0-9_]*
(Editar: adicionado sublinhado ausente na 2ª classe de caracteres.)
Uma observação rápida, como alguns shells não suportam o + na regex, uma regex potencialmente mais portátil pode ser:
[a-zA-Z_]{1,}[a-zA-Z0-9_]{0,}
fonte
[a-zA-Z_][a-zA-Z0-9_]*
Para aqueles como eu que acham a referência ao bash-4.1 um pouco vaga (616.000 linhas de código), aqui estão algumas dicas para encontre as linhas de código relevantes:subst.c: param_expand(), in the default case
->general.h:
/ * Defina exatamente o que consiste um identificador de shell legal. * / #define legal_variable_starter (c) (ISALPHA (c) || (c == ' ')) #define legal_variable_char (c) (ISALNUM (c) || c == ' ')a word consisting solely of underscores, digits, and alphabetics from the portable character set. The first character of a name is not a digit
.Meu teste rápido mostrou que eles basicamente seguem as mesmas regras que os nomes de variáveis C, a saber
_
e 0-9Portanto, isso exclui
.
dentro deles. Qualquer nome de variável ilegal é creditadounknown command
.Isso foi testado no ZSH, que é principalmente compatível com BASH.
fonte
Depende do que você quer dizer com 'permitido'.
Ignorando o Windows para o nonce:
O ambiente é uma matriz de seqüências de caracteres, passadas para a função principal de um programa. Se você ler execve (2), não verá requisitos ou limites nessas cadeias além da terminação nula.
Por convenção, cada sequência consiste em NAME = value. Não há convenção de cotação, portanto você não pode ter um '=' no nome desta convenção.
Humanos normais definem essas cordas discutindo-as com sua concha. Cada shell tem suas próprias idéias sobre quais são os NAMEs variáveis válidos; portanto, você deve ler a página do manual no momento para ver o que pensa.
Geralmente, coisas como com.baseball.spit = fleagh são propriedades do sistema Java e, se algum programa Java deseja ou não retornar ao ambiente, é melhor especificá-los com -D.
fonte
Depende da casca. Suponho que você esteja usando o bash por padrão. Nesse caso, letras, números e sublinhados são permitidos, mas você não pode iniciar o nome da variável com um número. No Bash v.3, os períodos não são permitidos nos nomes de variáveis .
fonte
SIM, VOCÊ PODE FAZER.
Use
exec
eenv
comando para implementar esta cena.Dispositivo de teste no Docker
Executar comando no contêiner:
Verifique as variáveis de ambiente:
Use
ps aux
para verificar se o PID não foi alteradoUse
python
para verificar a variável environmentemntOUTPUT é
happy-variable-name
.O que acontece?
Outra maneira
Se você estiver usando a janela de encaixe, poderá definir variáveis no Dockerfile
Se você estiver usando o kubernetes, poderá configurar a variável pelo ConfigMap
test.yaml
Implantar pod
kubectl apply -f test.yaml
Verifique a
kubectl logs foobar
saída:O ConfigMap permite '-', '_' ou '.'
fonte
Embora a maioria dos shell não permita definir variáveis de ambiente (conforme mencionado em outras respostas), se você precisar, poderá executar outros programas com variáveis de ambiente não padrão usando
env(1)
.Por exemplo, apagando todo o ambiente e definindo
Strange.Env:Var
como valorfoo
e executando o programa perl que o imprime:irá imprimir
fonte