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

22

J'ai rencontré un problème étrange. J'ai mis quelques variables env .bashrcet 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.shavec le contenu ci-dessous:

#! /bin/bash
echo $HADOOP_HOME

Lorsque je lance au-dessus du script, fait écho à une ligne vide:

/tmp/sample.sh
   
Mehraban
la source
1
Pouvez-vous montrer la partie pertinente de votre .bashrc? Je suppose que vous n'êtes pas exporting :, export HADOOP_HOME=/home/me/dist/hadooplorsque vous exécutez /tmpsample.sh` (qui génère un nouveau bashavec un nouvel environnement) HADOOP_HOME n'est pas dans le nouvel environnement.
John N

Réponses:

29

C'est parce que la HADOOP_HOMEvariable 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 script s'exécutera dans sa propre instance bash (c'est ce que #!/bin/bashfait le) qui est un shell enfant de celui en cours. Les variables ne sont pas transmises aux shells enfants par défaut, uniquement si elles sont exportées. Considérez chaque session bash comme indépendante (elles le sont en grande partie). Vous ne voulez généralement pas que les variables définies dans l'une polluent l'environnement d'une autre. Pour les cas où cela est nécessaire, utilisez export.

terdon
la source