Может ли скрипт изменить переменную окружения своей вызывающей оболочки?
Я устанавливаю свой JAVA_HOME
в моем ~/.bashrc
файл.
Теперь мне нужно создать скрипт, который изменит JAVA_HOME
только для текущего терминала, чтобы я мог запустить приложение, которое требует Java 5.
Я создал этот скрипт для выполнения этой задачи, но после окончания я вижу, что JAVA_HOME не обновляется
export JAVA_HOME=/usr/lib/jvm/java-5-oracle/
export PATH=$PATH:$JAVA_HOME
Вот результат
$ ./javaHome5.sh
$ echo $JAVA_HOME
/usr/lib/jvm/java-6-oracle/
Я думаю, что причина этого не в том, что скрипт выполняется в своем собственном терминале, поэтому, когда скрипт завершится, текущий терминал не будет затронут.
В настоящее время я нашел только один способ:
- Редактировать мой
~/.bashrc
и измените JAVA_HOME var - Бежать
source ~/.bashrc
применить изменения в текущем терминале. Который снова не может быть применен в сценарии, так какsource
Команда должна быть запущена в текущем окне.
Излишне говорить, что это изменение относится ко всем новым окнам терминала, поэтому мне практически нужно сделать это дважды: один перед запуском моего приложения и еще один раз сразу после этого, просто чтобы восстановить значения параметров среды по умолчанию. Это не очень удобно.
У вас есть идеи, как я могу изменить эту переменную, используя скрипт?
1 ответ
Это невозможно. Как вы правильно заметили, ваш скрипт выполняется в собственной оболочке. Эта оболочка получает копию среды своей родительской оболочки, когда она разветвлена, и у нее нет возможности получить доступ к среде родительской оболочки. И это хорошо, потому что в противном случае сценарии могут иметь всевозможные непредвиденные побочные эффекты.;)
Чтобы изменить переменные в вашей текущей оболочке, вы всегда можете получить исходный файл скрипта (вместо того, чтобы выполнять его как независимый процесс), чтобы скрипт выполнялся вашей текущей оболочкой вместо разветвленной. Если ваш скрипт называется myscript.sh
называйте это как source myscript.sh
вместо ./myscript.sh
,