Переменные среды не доступны в bash-скрипте


22

Я столкнулся со странной проблемой. Я поместил некоторые переменные env .bashrcи он работает как следует:

echo $HADOOP_HOME
/home/me/dist/hadoop

Но переменная env недоступна при выполнении сценариев bash. Предположим, я создаю /tmp/sample.shс содержанием ниже:

#! /bin/bash
echo $HADOOP_HOME

Когда я запускаю вышеуказанный скрипт, отображается пустая строка:

/tmp/sample.sh
   

1
Можете ли вы показать соответствующую часть вашего .bashrc? Я предполагаю, что вы не используете export:, export HADOOP_HOME=/home/me/dist/hadoopкогда вы запускаете /tmpsample.sh` (который порождает новое bashв новой среде), HADOOP_HOME не в новой среде.
Джон Н

Ответы:


29

Это потому, что HADOOP_HOMEпеременная не экспортируется:

$ 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

Когда вы запускаете сценарий оболочки, этот сценарий будет запускаться в своем собственном экземпляре bash (это то, что #!/bin/bashделает), который является дочерней оболочкой текущего. Переменные по умолчанию не передаются дочерним оболочкам, только если они экспортируются. Думайте о каждом сеансе bash как о независимом (в основном они есть). Обычно вы не хотите, чтобы переменные, определенные в одном, загрязняли окружение другого. Для тех случаев, когда это необходимо, используйте export.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.