2010-06-19 4 views
0

У меня есть Баш скрипт следующим образом:Bash оболочка переменных потерь среды между двумя линиями

rvm use 1.8.7 
rvm list 

Первая строка является функцией загружена в моем файле .bashrc, который определяет некоторые переменных окружение. При выполнении второй строки эти переменные были установлены на их предыдущие значения (установленные значения были потеряны). Что мне здесь не хватает?

Выполняется на ubuntu окно.

+4

Не могли бы вы рассказать нам больше о 'rvm'? Здесь очень важно поведение. –

ответ

2

Создается подоболочка и переменные устанавливаются внутри него. Когда подоболочка выходит, изменения теряются. Это часто происходит, когда петля while находится в трубе. Не видя функции, невозможно быть более конкретным, чем это.

+0

Здравствуйте, Dennis, Это источник для функции. Любое предложение? http://gist.github.com/449879 –

+0

Это не функция, это сценарий, и в нем нет функций. Однако он устанавливает некоторые переменные среды. Если вы «отправите» этот файл, он установит их в текущую среду. Однако, если вы запустите его, они не будут сохраняться в текущей среде. Если переменные не экспортируются в этот файл, когда они находятся ближе к концу: 'source $ rvm_scripts_path/rvm', они не будут доступны этому скрипту/функции, когда он будет запущен в конце:' rvm $ * '. Пожалуйста, покажите функцию, которая определена где-то так: 'rvm() {...}' или 'function rvm ...'. –

+0

Hello Dennis, Извините, это была моя ошибка. Я думал, что это функция, потому что я читаю ее где-то в другом месте. Код avoe находится в файле rvm, который получен из файла bash_profile, когда пользователь входит в систему. После входа в систему мы запускаем CI-сервер как «nohup java -war hudson.war», и этот процесс будет вызывать «build.sh "файл: rvm use 1.8.7 rvm list И это когда вторая строка не имеет доступа к значениям, установленным с первого. –

0

при определении переменных окружения, которые вы хотите сделать доступными для всех подоболочек вам нужно добавить префикс, экспорт, как так:

экспорта MyVar = «некоторое значение»

Я хотел бы проверить, что РВМ делает это правильно

+0

Но изменения в подоболочках не будут сохраняться родительской. Попробуйте это в Bash: 'a = 11; эхо привет | при чтении b; do echo "startloop [$ a] [$ b]"; а = 22; echo "внутри [$ a] [$ b]"; сделанный; echo "вне [$ a] [$ b]" '. Труба в 'while' создает подоболочку. Теперь попробуйте его с 'export':' export a = 11; echo hi | при чтении b; do echo "startloop [$ a] [$ b]"; а = 22; echo "внутри [$ a] [$ b]"; сделанный; echo "outside [$ a] [$ b]" ' –

+0

Вы можете избежать подоболочки следующим образом:' while ... done <<(echo hi) 'или' while ... done <<< hi' –

+0

yes this this это правда, вы никогда не хотите, чтобы переменные оболочки потенциально загрязняли родительскую оболочку.однако, если вы используете сценарий rvm, тогда все переменные среды, определенные в rvm, будут доступны в родительском shelll – ennuikiller