Comment exporter une variable qui contient un point. Je reçois le 'nom de variable invalide' quand j'ai essayé:
export my.home=/tmp/someDir
-ksh: my.home=/tmp/someDir: invalid variable name
Même échapper à métacaractère dot (.) Din n'a pas aidé non plus
$ export my\.home=/tmp/someDir
export: my.home=/tmp/someDir: is not an identifier
shell
environment-variables
ksh
utilisateur1587504
la source
la source
Réponses:
Au moins pour
bash
la page de manuel, la syntaxe d'exportation est définie comme suit:Il définit également un "nom" comme:
Par conséquent, vous ne pouvez vraiment pas définir une variable comme
my.home
s'il ne s'agissait pas d'un identifiant valide.Je suis très sûr que votre ksh a une définition très similaire d'un identifiant et n'autorise donc pas ce type de variables. (Consultez sa page de manuel.)
Je suis également très sûr qu'il existe une sorte de norme générale (POSIX?) Spécifiant ce qui est autorisé comme identifiant (et donc comme nom de variable).
Si vous avez vraiment besoin de ce type de variable pour une raison quelconque, vous pouvez utiliser quelque chose comme:
de le définir quand même. Mais là encore, vous ne pourrez pas y accéder avec la syntaxe de shell normale. Dans ce cas, vous avez probablement besoin d'une autre langue comme perl:
Par exemple
devrait imprimer votre chemin.
la source
ANT_OPTS
ou par ~ / .antrc. Pas besoin de noms de variables d'environnement étranges pour ant lui-même.Alors que les variables d'environnement peuvent avoir n'importe quel nom (y compris la chaîne vide) ne contenant ni signe égal ni octet nul, les shells mappent les variables d'environnement à des variables shell et, dans la plupart des shells, les noms de variables sont limités aux caractères alphanumériques ASCII
_
. t un chiffre (sauf pour les paramètres de position et d' autres comme ceux spéciaux$*
,$-
,$@
, ..., (qui ne sont pas mis en correspondance avec les variables d'environnement correspondantes)). Notez également que certaines variables sont réservées / spéciales par / au shell.Les exceptions à cela:
La
rc
coquille et ses dérivés commees
etakanga
prennent en charge un nom , sauf la chaîne vide, et ceux qui sont tout numérique ou contiennent des=
caractères (et toujours exporter toutes leurs variables à l'environnement, et méfiez - vous des variables spéciales comme*
,status
,pid
...):Cependant, il utilise son propre codage pour les variables dont le nom ne contient pas d'alnums ou pour les tableaux lorsqu'il est passé dans l'environnement des commandes en cours d'exécution:
AT & T
ksh
,yash
etzsh
(égalementbash
mais uniquement pour les caractères à octet unique), prennent en charge les alnums dans les paramètres régionaux actuels, pas seulement ceux en ASCII.Dans ces shells, vous pouvez modifier les paramètres régionaux pour considérer la plupart des caractères comme des caractères alpha, mais cela ne fonctionnerait pas pour les caractères ASCII tels que
.
. Vous pouvez tromperzsh
ouksh
penser que£
c'est une lettre, mais pas cela.
ni aucun autre caractère ASCII (où autoriser les caractères dans les noms de variables est concerné, pas pour le[[:alpha:]]
glob par exemple).ksh93
a des variables spéciales dont le nom contient un point comme${.sh.version}
, mais celles-ci ne sont pas mappées à des variables d'environnement et sont spéciales. Le.
est de s'assurer qu'il ne soit pas en conflit avec d'autres variables. Si elle avait choisi de l' appeler$sh_version
, il aurait pu les scripts potentiellement cassés qui a utilisé cette variable déjà (voir par exemple commentzsh
a des problèmes avec son$path
ou des$commands
variables tableau spécial / hachage (à la csh) qui brisent certains scripts).Notez que , en plus de coquilles qui ne supportent pas ces variables, des coquilles comme pdksh / mksh font supprimer les de l'environnement qu'ils reçoivent (
bash
supprime l'un avec un nom vide,ash
,ksh
etbash
supprimer les chaînes d'environnement qui ne contiennent pas de=
caractère):En résumé, le mieux est de coller avec les noms de variables pris en charge par la plupart des coquilles et même essayer d'utiliser les majuscules pour les variables d'environnement (et minuscules ou majuscules et minuscules pour les variables shell non exportées) en évitant ceux qui sont spéciaux dans des coquilles (comme
IFS
,PS1
,BASH_VERSION
...)Si vous devez définir une telle variable dans un shell qui ne la prend pas en charge, mais ne la supprime pas, vous pouvez soit réexécuter vous-même, avec quelque chose comme:
(Évidemment, si vous devez le faire au milieu du script, cela ne vous aidera pas, mais vous pourrez alors examiner cette approche pour enregistrer et restaurer l'environnement d'exécution du shell sur une nouvelle exécution). Ou essayez l'approche du débogueur:
(que l' on semble travailler avec
zsh
,yash
,csh
ettcsh
sur Linux AMD64, mais pas avec l' une des autres coquilles que j'ai essayé (mksh
,ksh93
,bash
,dash
)).la source
mksh
(andpdksh
) en effet, les processus d’environnement qu’ils génèrent sont entièrement récupérés, en utilisant uniquement les paramètres exportés dans l’environnement d’exécution du shell actuel, il n’existe donc aucun moyen de transmettre ces variables à travers ces shells. (Notez que les variables qui sont passées sont sujettes à changement. Par exemple, jemksh
Comme le signalent d’autres publications, les shells les plus courants ne permettent pas de définir des variables d’environnement avec des points dans le nom. Cependant, j'ai constaté des situations, impliquant notamment des programmes Docker et invoqués, dans lesquelles le logiciel nécessitait des valeurs de clé avec des points.
Toutefois, dans chacune de ces situations, ces paires clé-valeur peuvent être transmises au programme par d'autres moyens que les seules variables d'environnement. Par exemple, dans Ant, vous pouvez utiliser le "-propertyfile (nom du fichier)" pour transmettre une collection de valeurs-clés au format de fichier de propriétés. Confd permet "-backend file -file (fichier yaml)".
J'ai transmis les variables d'environnement sous la forme "C__any_value = 'my.property.key = la valeur'". J'ai ensuite basculé l'invocation du programme pour générer d'abord le fichier:
La
set
commande, dans Borne Shell, affichera chaque propriété sur une ligne distincte du formulaire.La
awk
commande ne traitera que les variables d'environnement commençant parC__
, puis extraira les valeurs contenues dans les guillemets simples.Cette méthode nécessite que la valeur de la variable d'environnement soit définie sous la forme précise requise par le programme de traitement. En outre, si votre valeur de propriété ou votre clé contient des guillemets simples, vous devrez alors remplacer le caractère de séparation de champ awk par un élément qui n'apparaîtra pas et entourer la valeur de ce caractère. Par exemple, pour utiliser
%
comme séparateur:(la sortie précise dépendra de votre shell.) Vous devrez prendre des mesures supplémentaires pour décoder l'échappement de la citation.
la source