web-dev-qa-db-fra.com

Les variables d'environnement ne sont pas accessibles dans le script bash

J'ai rencontré un problème étrange. J'ai mis quelques variables env dans .bashrc et cela fonctionne comme il se doit:

echo $HADOOP_HOME
/home/me/dist/hadoop

Mais la variable env n'est pas accessible lors de l'exécution de scripts bash. Supposons que je crée /tmp/sample.sh avec le contenu ci-dessous:

#! /bin/bash
echo $HADOOP_HOME

Lorsque je cours au-dessus du script, une ligne vide apparaît:

/tmp/sample.sh
   ‌
17
Mehraban

En effet, la variable HADOOP_HOME n'est pas exportée:

$ cat foo.sh
#!/bin/bash
echo "HADOOP_HOME: $HADOOP_HOME"


$ HADOOP_HOME=/home/me/dist/hadoop
$ echo $HADOOP_HOME
/home/me/dist/hadoop

$ foo.sh
HADOOP_HOME: 

$ export HADOOP_HOME
$ foo.sh
HADOOP_HOME: /home/me/dist/hadoop

Lorsque vous exécutez un script shell, ce dernier s'exécutera dans sa propre instance bash (c'est ce que fait le #!/bin/bash), qui est un shell enfant de celle en cours. Les variables ne sont pas transmises aux shells enfants par défaut, uniquement si elles sont exportées. Pensez à chaque session bash en tant qu'indépendante (ils le sont en grande partie) En général, vous ne voulez pas que les variables définies dans l’une polluent l’environnement de l’autre. Dans les cas où cela est nécessaire, utilisez export.

19
terdon