Quels caractères sont autorisés dans les noms de variables d'environnement Linux? Ma recherche rapide des pages de manuel et du Web n'a produit que des informations sur la façon de travailler avec des variables, mais pas sur les noms autorisés.
J'ai un programme Java qui nécessite une variable d'environnement définie contenant un point, comme com.example.fancyproperty
. Avec Windows, je peux définir cette variable, mais je n'ai pas eu de chance de la définir sous Linux (essayé dans SuSE et Ubuntu). Ce nom de variable est-il même autorisé?
linux
syntax
environment-variables
Christian Semrau
la source
la source
-D
option de ligne de commande), donc cela fonctionne maintenant. Évidemment, le programme regarde dans les deux ensembles de variables sans me le dire. Mais je suis toujours curieux de savoir quels noms de variables d'environnement sont autorisés.com_example_fancyproperty
etCOM_EXAMPLE_FANCYPROPERTY
.Réponses:
Du groupe ouvert :
Les noms peuvent donc contenir n'importe quel caractère sauf = et NUL, mais:
Ainsi, bien que les noms soient valides, votre shell peut ne prendre en charge rien d'autre que les lettres, les chiffres et les traits de soulignement.
la source
[a-zA-Z_][a-zA-Z0-9_]*
(suggérant implicitement que cette forme est plus saine), mais la spécification réelle (citation 1) nécessite que toute implémentation prenne en charge tout sauf=
etNUL
?La section des standards POSIX sur les shells de la norme IEEE Std 1003.1-2008 / IEEE POSIX P1003.2 / ISO 9945.2 Shell and Tools ne définit pas la convention lexicale pour les noms de variables, mais un rapide coup d'œil à la source révèle qu'elle utilise quelque chose de similaire à
[a-zA-Z_]+[a-zA-Z0-9_]*
(Modifier: ajout de trait de soulignement manquant dans la 2e classe de caractères.)
Une note rapide, comme certains shells ne prennent pas en charge le + dans les regex, une regex potentiellement plus portable peut être:
[a-zA-Z_]{1,}[a-zA-Z0-9_]{0,}
la source
[a-zA-Z_][a-zA-Z0-9_]*
Pour ceux comme moi qui trouvent la référence à bash-4.1 un peu vague (616'000 lignes de code), voici quelques conseils pour trouver les lignes de code pertinentes:subst.c: param_expand(), in the default case
->general.h:
/ * Définir exactement en quoi consiste un identifiant de shell légal. * / #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
.Mes tests rapides ont montré qu'ils suivent fondamentalement les mêmes règles que les noms de variables C, à savoir
_
et 0-9Donc, cela exclut à l'
.
intérieur d'eux. Tout nom de variable non autorisé est créditéunknown command
.Cela a été testé dans ZSH, qui est principalement compatible BASH.
la source
Cela dépend de ce que vous entendez par «autorisé».
Ignorer Windows pour le nonce:
L'environnement est un tableau de chaînes, passé à la fonction principale d'un programme. Si vous lisez execve (2), vous ne verrez aucune exigence ou limite sur ces chaînes autres que null-terminaison.
Par convention, chaque chaîne se compose de NOM = valeur. Il n'y a pas de convention de citation, vous ne pouvez donc pas avoir de «=» dans le nom de cette convention.
Les humains normaux fixent ces chaînes en les discutant avec leur coquille. Chaque shell a ses propres idées de ce que sont des NOM de variables valides, vous devez donc lire la page de manuel du shell-of-the-moment pour voir ce qu'il pense.
Généralement, des choses comme com.baseball.spit = fleagh sont des propriétés système Java, et que certains programmes Java soient prêts à revenir à l'environnement, il est préférable de les spécifier avec -D.
la source
Cela dépend de la coque. J'imagine que vous utilisez bash par défaut, auquel cas les lettres, les chiffres et les traits de soulignement sont autorisés, mais vous ne pouvez pas commencer le nom de la variable par un nombre. Depuis Bash v.3, les points ne sont pas autorisés dans les noms de variables .
la source
OUI TU PEUX LE FAIRE.
Utilisez la commande
exec
etenv
pour implémenter cette scène.Appareil de test dans Docker
Exécutez la commande dans le conteneur:
Vérifiez les variables d'environnement:
Utilisez
ps aux
pour vérifier que le PID n'a pas été modifiéUtilisez
python
pour vérifier la variable d'environnementOUTPUT est
happy-variable-name
.Qu'est-ce qui se passe?
Autrement
Si vous utilisez docker, vous pouvez définir une variable dans Dockerfile
Si vous utilisez kubernetes, vous pouvez définir la variable par ConfigMap
test.yaml
Déployer le pod
kubectl apply -f test.yaml
Vérifiez la
kubectl logs foobar
sortie:ConfigMap autorise '-', '_' ou '.'
la source
Bien que la plupart des shell ne permettent pas de définir des variables d'environnement (comme mentionné dans d'autres réponses), si vous en avez besoin, vous pouvez exécuter d'autres programmes avec des variables d'environnement non standard en utilisant
env(1)
.Par exemple, effacer tout l'environnement et mettre
Strange.Env:Var
à valeurfoo
, et exécuter le programme perl qui l'imprime:va imprimer
la source