Змінні середовища не доступні у скрипті 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 не в новому середовищі.
Іоанн N

Відповіді:


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робиться), який є дочірньою оболонкою поточного. Змінні не передаються в дочірні оболонки за замовчуванням, лише якщо вони експортуються. Подумайте про кожен баш-сеанс як незалежний (вони багато в чому є). Зазвичай ви не хочете, щоб змінні, визначені в одному, забруднювали середовище іншого. Для тих випадків, коли це необхідно, використовуйте export.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.