2013-12-25 1 views
0

Я пытаюсь установить и редактировать постоянно переменные среды в скрипте bash, добавить экспорт VAR = "demo" в .bash_profile, работающий для установки цели, , но я не могу отредактируйте этот var,Постоянно задает и редактирует переменную окружения в centos linux

Идея состоит в том, чтобы написать скрипт для установки или редактирования, если он существует в этом файле.

попробовал этот код сейчас, но не получилось:

VARIABLE_FILE=/root/.bash_profile 
if [ -f ${VARIABLE_FILE} ] ; then 
    . ${VARIABLE_FILE} 
    if [ ! -z "${USER_PROMPT}" ] ; then 
     export USER_PROMPT="haloooo" 
     echo "USER PROMPT : $USER_PROMPT" 
     # Prints the correct value but doesn't update .bash_profile 
    fi 
fi 
+0

См. [Этот ответ] (http://stackoverflow.com/a/20740691/841108) на очень похожий вопрос. –

ответ

2

Эти команды не изменять любые файлы - они читают файл, если он существует, то экспортирует переменную в текущем контексте только , и выводит значение на стандартный вывод (обычно на терминал).

Изменение dotfile программно не рекомендуется, потому что есть множество тонких ошибок вы можете столкнуться и из-за сочетания фактического кода с напечатанным кодом (в сценарии модифицирующего) и потому, что вы, по сути, не может быть убедитесь, что целевой файл содержит что-то, что заставляет ваш скрипт вести себя неожиданно. Это, в сочетании с тем, что вы не можете войти в систему как обычный пользователь, являются вескими причинами, чтобы избежать этого в целом. Вы были предупреждены.

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

echo "USER_PROMPT=haloooo" >> "$VARIABLE_FILE" 

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

Более продвинутая версия будет заменить строку, если она существует:

if grep '^USER_PROMPT=' -- "$VARIABLE_FILE" 
then 
    sed -i -e 's/^USER_PROMPT=.*/USER_PROMPT=haloooo/' -- "$VARIABLE_FILE" 
else 
    echo "USER_PROMPT=haloooo" >> "$VARIABLE_FILE" 
fi 

Имейте в виду, что если вы хотите поставить произвольный текст в восстановительной стоимости, вы должны убедиться в escape it for sed. Кроме того, эта команда перезапишет каждую строку, которая начинается с USER_PROMPT=, так что если вы хотите, у него разные значения в разное время во время вашего скрипта (переменное повторное использование вообще злое) вы только что ввели ошибку. Если вам это нужно, вы можете попробовать replacing only the last occurrence.

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

+0

спасибо за подробный ответ, я добавил строку для экспорта этой переменной в /root/.bash_profile, например JAVA_HOME, которая каждый раз, когда пользователь будет входить в нее, установит эту переменную, и если он захочет изменить, то я хотел бы изменить для текущего сеанса и bash_profile, я думал, что перед этим команда экспорта сохраняет переменную окружения в каком-то файле, и я хотел бы редактировать ее для текущего сеанса – seismael

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