2013-12-02 4 views
1

Я пытаюсь установить переменную окружения $PATH, чтобы указать на разные пути по мере необходимости, но я столкнулся с некоторыми проблемами.Включение/выключение переменных окружения

Главное, что, когда я устанавливаю PATH на мой сервис, который мне нужен, я хочу, чтобы он оставался таким образом во всех последующих командах bash. То есть, когда я открываю другую оболочку bash, она также будет установлена ​​там, пока я не решит ее вернуть. И когда я переключу PATH обратно на свое первоначальное значение. Я хочу, чтобы он остался таким.

Я добавил небольшой скрипт в мой .bashrc, я также попытался сделать отдельный скрипт, который изменит переменные среды. Но проблема остается: если я открываю новую оболочку bash, она наследует переменные среды по умолчанию и PATH по умолчанию.

Я устанавливаю те, которые позволят использовать службу демона. Я попытался включить/выключить сервис. Это не работает, потому что нужно изменить пути, иначе оболочка будет пытаться использовать эти пути среды, но служба, находящаяся вне нее, просто зависает.

Я попробовал запустить небольшую программную оболочку C для выполнения этих задач, но я столкнулся с той же проблемой.

ответ

1

Чтобы переменная среды существовала в сеансах оболочки, вам необходимо поместить эти переменные в файл конфигурации оболочки. Обычно это делается либо в ~/.bashrc, либо в ~/.profile (если вы используете Bash). Например, в моем ~/.profile файле у меня есть:

export PATH=/opt/local/bin:/opt/local/sbin:$PATH 

я могу добавить к этому пути столько, сколько я хочу. Переменная $PATH в конце добавит то, что находится в пути.

Если вам нужны сценарии, чтобы иметь доступ к переменным, вы должны поместить PATH в файл .bashrc. (what is the difference between .bashrc and .profile)

Если вы вносите изменения в один из файлов конфигурации оболочки, изменения не будут действовать до тех пор, пока эти файлы не будут использованы снова. Эти файлы используются только тогда, когда оболочка сначала инициализируется. Чтобы изменения вступили в силу, вам нужно выйти из системы и вернуться в нее или открыть новую оболочку и закрыть старый или source файл, в который были внесены изменения.

$ vim ~/.bashrc (edit the file) 
$ source ~/.bashrc (then reinitialize the shell with the file) 

Если вам нужна только переменная будет доступна в текущей оболочке и любых подпроцессов, используя export бы все, что вам нужно.

+0

Thank You! Вы дали мне идею, у меня был скрипт, который изменит PATH по мере необходимости, но только в текущей рабочей оболочке. Как вы сказали, я могу изменить этот скрипт, чтобы изменить текущую переменную PATH оболочки, а также перейти и изменить ее в .bashrc. Таким образом, когда я запускаю, например, $ ./changemypath, и он изменит его на то, что я хочу в текущей оболочке, с которой я работаю, и во всех последующих оболочках, которые я открываю. – stef

+0

Рад, что я мог помочь. – SunSparc

0

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

# Make sure our version of the .bashrc file is up-to-date, or reload it. 
chk_bashrc_timestamp() { 
    if [[ "$_BASHRC_TIMESTAMP" -lt "$(get_file_timestamp "$HOME/.bashrc")" ]]; then 
     echo >&2 "Reloading .bashrc..." 
     . ~/.bashrc 
    fi 
} 
_BASHRC_TIMESTAMP=$(date +%s) 

PROMPT_COMMAND=chk_bashrc_timestamp 

Единственная трудность, вы не должны использовать $PATH в определении PATH, или он будет повторять все PATH каждый раз, когда это необходимо:

Использование

SYSPATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin" 
PATH="$HOME/bin:$SYSPATH:/opt/mystuff" 

вместо от

PATH="$HOME/bin:$PATH:/opt/mystuff" 

Я использовал это с большим удовлетворением в моем собственном .bashrc, за исключением того, что я защитил свой PATH от перезагрузки каждый раз, установив его в инструкции if. (Вы можете обнаружить, что у вас есть другие вещи, которые необходимо защитить таким образом.)

if _BASHRC_WAS_RUN 2>/dev/null; then 
    :; 
else # Stuff that only needs to run the first time we source .bashrc. 
     # Useful to allow resourcing new changes 
    export PATH="$HOME/bin:$HOME/.cabal/bin: ..." 
    alias _BASHRC_WAS_RUN=true 
fi 
+0

Спасибо, это очень помогает! Эти экологические войны дали мне много трудных времен. – stef

+0

Нет проблем. Обычно я работаю с * лотом * снарядов одновременно (> 10), поэтому мне почти необходимо перейти в эту крайность. – jpaugh

Смежные вопросы