Est-ce une mauvaise pratique d'avoir un signe dollar dans la valeur d'une variable d'environnement?
ex:
MY_VAR="$toto"
Pour être plus précis, j'aimerais le définir dans le fichier /etc/environment
afin qu'il soit accessible par un programme Java. J'ai fait un test et ça marche, mais je veux juste m'assurer que je ne rencontrerai aucun effet secondaire catastrophique. La valeur de la variable est un mot de passe et commence par un signe dollar, je n'ai donc pas le choix.
Pour le cas spécifique de _/etc/environment
_, non, un _$
_ dans la valeur de la variable ne signifie rien de spécial. _/etc/environment
_ est un fichier lu par un module PAM nommé pam_env
, et _pam_env
_ a une syntaxe spécifique pour interpréter _$
_:
/etc/environment
_, il est laissé non interprété.Dans /etc/security/pam_env.conf
et _~/.pam_environment
_ (un fichier spécifique à l'utilisateur), _pam_env
_ traite _$
_ spécialement lorsqu'il voit des lignes avec la syntaxe suivante:
_FOO DEFAULT=SOMETHING${BAR}SOMETHINGELSE$BAR
FOO OVERRIDE=SOMETHING${BAR}SOMETHINGELSE$BAR
_
Dans ce cas, _${BAR}
_ est remplacé par la valeur de la variable BAR
, mais pas _$BAR
_.
Dans les deux cas, pour une ligne comme:
_FOO=BAR$BAR${BAR}
_
Le contenu de la variable FOO
sera la chaîne littérale _BAR$BAR${BAR}
_.
La page de manuel _pam_env.conf
_ contient des exemples:
_Silly examples of escaped variables, just to show how they work.
DOLLAR DEFAULT=\$
DOLLARDOLLAR DEFAULT= OVERRIDE=\$${DOLLAR}
DOLLARPLUS DEFAULT=\${REMOTEHOST}${REMOTEHOST}
ATSIGN DEFAULT="" OVERRIDE=\@
_
Votre exemple n'illustre pas votre question.
$ toto="somevalue"
$ MY_VAR="$toto"
$ echo $MY_VAR
somevalue
$
Pour faire ce que vous avez demandé, vous aurez besoin de:
MY_VAR='$toto'
ou
MY_VAR="\$toto"
Je ne peux pas dire avec certitude si c'est une mauvaise pratique. Personnellement, je ne vois pas de problème évident.
Beaucoup ont fait remarquer que MY_VAR="$toto"
assignera à MY_VAR
la valeur actuelle de $toto
ou une chaîne vide au cas où $toto
ne serait pas défini (ou si $toto
se contient une chaîne vide évidemment), mais je suis surpris que personne n'ait encore signalé que MY_VAR="$toto"
va pas définir une variable d'environnement mais plutôt une variable Shell (sauf si une variable nommée MY_VAR
est déjà présent dans l’environnement, peut-être parce que cela n’est que tangentiel à la question actuelle).
Cependant, plus précisément, ce n’est pas une mauvaise pratique ou une pratique tout aussi mauvaise que d’avoir un autre caractère spécial Shell dans une variable, ce qui n’est souvent pas évitable.
Dans 99% des cas, le shell développera la variable dans le shell actuel: ne seule fois (ou ne la développera pas du tout, par exemple, entre guillemets simples):
$ MY_VAR='$toto'
$ echo $MY_VAR
$toto
$ echo '$MY_VAR'
$MY_VAR
$ echo "$MY_VAR"
$toto
$ echo $(echo $MY_VAR)
$toto
Le 1% des cas étant, par exemple, lorsque la variable est référencée dans une expression eval
, ce qui ajoute un niveau d'indirection:
$ MY_VAR='$toto'
$ eval echo $MY_VAR
$
Mais c’est évidemment le résultat escompté, et encore une fois, le fait de placer tout autre caractère spécial Shell dans une variable devrait être considéré comme une mauvaise pratique de la même manière:
$ MY_VAR='&&'
$ eval echo $MY_VAR
bash: syntax error: unexpected end of file
(la vérité étant que en utilisant eval
est souvent une mauvaise pratique, pour cette raison même).
Donc non, avoir un signe dollar dans une variable Shell/environnement n’est pas une mauvaise pratique, du moins pas plus que d’avoir un autre caractère spécial Shell.
Pour répondre à votre question exacte:
Oui, c’est une mauvaise pratique d’avoir un signe dollar dans la valeur d’une variable d’environnement. Cependant, ce n'est pas ce que l'extrait de code que vous avez affiché fait réellement.
MY_VAR="$toto"
$
est un caractère spécial pour votre shell (qu'il s'agisse de bash
ou dash
) et que, sauf s'il est protégé contre le développement variable, vous ne créerez pas de signe dollar littéral dans la valeur de MY_VAR
.
Pour ce faire, vous devez vous échapper du $
, soit avec une barre oblique inverse juste avant, soit entre guillemets simples.