web-dev-qa-db-fra.com

Caractères autorisés dans les noms de variables d'environnement Linux

Quels caractères sont autorisés dans les noms de variables d'environnement Linux? Ma recherche superficielle dans les pages de manuel et sur le Web ne produisait 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 la chance de le définir sous Linux (essayé sous SuSE et Ubuntu). Ce nom de variable est-il même autorisé?

128
Christian Semrau

De The Open Group :

Ces chaînes ont la forme nom = valeur; Les noms ne doivent pas contenir le caractère '='. Pour que les valeurs soient transférables sur des systèmes conformes à la norme IEEE 1003.1-2001, la valeur doit être composée de caractères. à partir du jeu de caractères portable ( sauf NUL et comme indiqué ci-dessous ).

Les noms peuvent donc contenir n’importe quel caractère sauf = et NUL, mais:

Les noms de variable d'environnement utilisés par les utilitaires du volume Shell et utilitaires de IEEE Std 1003.1-2001 sont uniquement composés de lettres majuscules, de chiffres et du caractère '_' (trait de soulignement) parmi les caractères définis dans le jeu de caractères portables et ne commence pas par un chiffre . D'autres caractères peuvent être autorisés par une implémentation; les applications doivent tolérer la présence de tels noms.

Ainsi, bien que les noms puissent être valides, votre shell peut ne prendre en charge que des lettres, des chiffres et des traits de soulignement.

186
Robert Gamble

Les normes POSIX sur la section shells de Norme IEEE 1003.1-2008/IEEE POSIX P1003.2/ISO 9945.2 La norme Shell et outils ne définit pas la convention lexicale pour les noms de variables, bien qu'un curseur regardez la source révèle qu'il utilise quelque chose de similaire à

[a-zA-Z_]+[a-zA-Z0-9_]*

(Édition: ajout d'un soulignement manquant dans la classe du deuxième caractère.)

Une remarque rapide, comme certains shells ne supportent pas le + dans regex, un regex potentiellement plus portable peut être:

[a-zA-Z_]{1,}[a-zA-Z0-9_]{0,}

33
Aiden Bell

Mes tests rapides ont montré qu’elles suivaient essentiellement les mêmes règles que les noms de variables C, à savoir

  1. a-z, A-Z, _ et 0-9
  2. Peut NE PAS commencer par un chiffre

Donc, cela exclut . à l'intérieur d'eux. Tout nom de variable illégal est crédité de unknown command.

Ceci a été testé en ZSH, qui est principalement compatible avec BASH.

11
LukeN

Cela dépend de la coquille. 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 chiffre. A partir de Bash v.3, les points ne sont pas autorisés dans les noms de variables .

5
ire_and_curses

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 la terminaison nulle.

Par convention, chaque chaîne est composée de NOM = valeur. Il n'y a pas de convention de citation, vous ne pouvez donc pas avoir un '=' dans le nom de cette convention.

Les humains normaux définissent ces chaînes en les discutant avec leur Shell. Chaque shell a ses propres idées sur ce que sont des noms de variables valides. Vous devez donc lire la page de manuel relative au shell du moment pour voir ce qu’il en pense.

En règle générale, des éléments tels que com.baseball.spit = fleagh sont Java) et si un programme Java) est prêt à se replier sur l'environnement, il vaut mieux les spécifier avec -D.

4
bmargulies