Auf Umgebungsvariablen kann im Bash-Skript nicht zugegriffen werden

22

Ich bin auf ein komisches Problem gestoßen. Ich habe einige env-Variablen in .bashrcund es funktioniert wie es sollte:

echo $HADOOP_HOME
/home/me/dist/hadoop

Auf die Variable env kann jedoch nicht zugegriffen werden, wenn Bash-Skripte ausgeführt werden. Angenommen, ich erstelle /tmp/sample.shmit folgendem Inhalt:

#! /bin/bash
echo $HADOOP_HOME

Wenn ich das obige Skript ausführe, wird eine leere Zeile angezeigt:

/tmp/sample.sh
   
Mehraban
quelle
1
Können Sie den relevanten Teil von Ihrem zeigen .bashrc? Ich vermute , dass Sie Folgendes nicht tun export: export HADOOP_HOME=/home/me/dist/hadoopWenn Sie /tmpsample.sh ausführen (was ein neues bashmit einer neuen Umgebung erzeugt), befindet sich HADOOP_HOME nicht in der neuen Umgebung.
John N

Antworten:

29

Das liegt daran, dass die HADOOP_HOMEVariable nicht exportiert wird:

$ 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

Wenn Sie ein Shell-Skript ausführen, wird dieses Skript in einer eigenen Bash-Instanz ausgeführt (das ist, was das #!/bin/bashtut), die eine untergeordnete Shell der aktuellen ist. Variablen werden standardmäßig nur dann nicht an untergeordnete Shells übergeben, wenn sie exportiert werden. Stellen Sie sich jede Bash-Sitzung als unabhängig vor (sie sind es größtenteils). Normalerweise möchten Sie nicht, dass in einer Variablen definierte Variablen die Umgebung einer anderen verschmutzen. In den Fällen, in denen dies erforderlich ist, verwenden Sie export.

terdon
quelle