web-dev-qa-db-fra.com

Signe dollar dans la valeur de la variable d'environnement

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.

2
jon

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 _$_:

  1. Dans _/etc/environment_, il est laissé non interprété.
  2. 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=\@
_
3
muru

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.

9

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.

8
kos

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.

2
Wildcard