Zmienne środowiskowe nie są dostępne w skrypcie bash

22

Wpadłem na dziwny problem. Wstawiłem kilka zmiennych env .bashrci działa to tak, jak powinno:

echo $HADOOP_HOME
/home/me/dist/hadoop

Ale zmienna env nie jest dostępna podczas wykonywania skryptów bash. Załóżmy, że tworzę /tmp/sample.shz poniższą zawartością:

#! /bin/bash
echo $HADOOP_HOME

Kiedy uruchamiam powyżej skryptu, wyświetla pusty wiersz:

/tmp/sample.sh
   
Mehraban
źródło
1
Czy możesz pokazać odpowiednią część swojego .bashrc? Domyślam się, że nie exporting: export HADOOP_HOME=/home/me/dist/hadooppo uruchomieniu /tmpsample.sh` (który spawnuje nowy bashz nowym środowiskiem) HADOOP_HOME nie znajduje się w nowym środowisku.
John N

Odpowiedzi:

29

Jest tak, ponieważ HADOOP_HOMEzmienna nie jest eksportowana:

$ 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

Po uruchomieniu skryptu powłoki skrypt ten będzie działał we własnej instancji bash (tak właśnie #!/bin/bashdziała), która jest potomną powłoką bieżącej. Zmienne nie są domyślnie przekazywane do powłok potomnych, tylko jeśli są eksportowane. Pomyśl o każdej sesji bash jako niezależnej (w dużej mierze są). Zwykle nie chcesz, aby zmienne zdefiniowane w jednym zanieczyszczały środowisko innego. W przypadkach, w których jest to konieczne, użyj export.

terdon
źródło