Как добавить переменные среды?

365

Я использую Ubuntu 11.04. Я использую терминал для запуска сеанса bash и хочу добавить переменную окружения:

$r@hajt:~$ env THEVAR=/example

Но это не работает. Он показывает все переменные с THEVAR быть последним, но еще один вызов, чтобы envне показывать THEVARanymore- env | grep THEVARвозвращает ничего.

Аналогично, сценарии с помощью export ( export THEVAR=/example) или других назначений переменных ( THEVAR=/example) не добавляют переменную окружения.

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

ОБНОВЛЕНИЕ: реальный смысл моего вопроса был следующим: https://stackoverflow.com/questions/496702/can-a-shell-script-set-environment-variables-of-the-calling-shell

(В любом случае, я выберу наиболее проголосовавший ответ и оставлю отредактированный заголовок - это было не то, что я спрашивал)

env запускает программу в измененной среде, затем отклоняет все изменения.

фуканье
источник
1
Когда определено / экспортировано в .bashrc, оно работает правильно.
Хафф
возможный дубликат переменной Google Планета Земля и $ BROWSER
Исаия
1
Как насчет THEVAR=/example?
Олег Припин
2
Другой касается глобальных переменных, этот не добавляет такого ограничения. Я бы держал это отдельно.
Лекенштейн

Ответы:

571

Чтобы установить переменную только для текущей оболочки:

VARNAME="my value"

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

export VARNAME="my value"      # shorter, less portable version

Чтобы установить его навсегда для всех будущих сеансов bash, добавьте такую ​​строку в ваш .bashrcфайл в вашем $HOMEкаталоге.

Чтобы установить его постоянно, и для всей системы (все пользователи, все процессы) добавьте переменную set в / etc / environment:

sudo -H gedit /etc/environment

Этот файл принимает только переменные назначения, такие как:

VARNAME="my value"

Не используйте exportключевое слово здесь.

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

Михал Шрайер
источник
29
Shell config files such as ~/.bashrc, ~/.bash_profile, and ~/.bash_login are often suggested for setting environment variables. While this may work on Bash shells for programs started from the shell, variables set in those files are not available by default to programs started from the graphical environment in a desktop session. help.ubuntu.com/community/EnvironmentVariables
SudoSURoot
1
@ Mr.Hyde да, это, наверное, разумное место
Михал Шрайер
1
@BharadwajRaju, потому что в некоторых старых системах UNIX можно экспортировать только переменную, которая уже установлена. Старый Солярис и HP-UX например.
Михал Шрайер
1
Как только вы установите переменную среды, как я могу быстро просмотреть ее, чтобы убедиться, что она установлена?
Род
1
@Rodecho $myvar
Qwerty
29

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

$ export THEVAR=/example

Переменная будет установлена ​​до конца сеанса оболочки или до сброса.

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

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

Для объяснения разницы между поиском и исполнением см. Этот ответ: https://superuser.com/questions/176783/what-is-the-difference-between-executing-a-bash-script-and-sourcing-a- баш-скрипт / 176788 # 176788

lesmana
источник
4
Как я могу заставить его работать только путем выполнения сценария? Без источников.
Мифрил
19

Чтобы окончательно добавить новую переменную среды в Ubuntu (протестировано только в 14.04), выполните следующие действия:

  1. Откройте терминал (нажав CtrlAltT)
  2. sudo -H gedit /etc/environment
  3. Введите ваш пароль
  4. Отредактируйте только что открытый текстовый файл:
    например, если вы хотите добавить FOO=bar, просто напишите FOO=barв новой строке
  5. Сохрани это
  6. После сохранения выйдите из системы и войдите снова.
  7. Ваши необходимые изменения сделаны.
user355501
источник
5
Я исправил ваш ответ, удалив более опасные фрагменты sudo gedit(см. Askubuntu.com/questions/270006/… ) и chmod 777. Последнее никогда не должно быть сделано в файле конфигурации системы.
Муру
Это правильный ответ для определенных случаев. Все сеансы, будь то сеансы пользовательской оболочки или нет, получат значение переменных, установленных здесь. Важно отметить, что, хотя это может выглядеть как сценарий оболочки, это не так - он позволяет вам только устанавливать переменные окружения (в отличие от использования таких функций оболочки, как ifили test)
Том Харрисон-младший
Если строка является строкой, я должен поставить ее между кавычками? Как Foo="bar"?
blue_chip
@blue_chip Нет, работает без кавычек.
Нажмите Upvote
4
@blue_chip для переменных среды, все это строка. Вам нужны только кавычки, когда он содержит пробелы.
Руслан
8

Чтобы изменения среды / var сохранялись после завершения сценария, вы должны использовать source ./script.shили сокращенную запись для источника ".", Например. ./script.sh

Source выполнит команды в сценарии, как если бы вы их набрали ... поэтому он меняет некоторые аспекты сценария, например, выходит ... поэтому, если ваш сценарий что-то проверяет и решает выйти, если, например, false, через вызов exit 0он прервет ваш текущий сеанс терминала / оболочки.

m0bl
источник
Это очень старый вопрос, на который уже есть принятый ответ, и несколько других ... Подумайте, отвечая на более свежие вопросы, пожалуйста ...
NerdOfCode
3
@NerdOfCode этот ответ решает проблему, которая все еще актуальна, и ни один из других ответов, включая принятый, не упоминает ее, насколько я вижу ... На самом деле, есть два значка для предоставления хороших ответов на старые вопросы, так что это поощряется
Zanna
1
Это именно то, что я искал. Мне нужно было видеть из сценария экспортированные переменные из сценария.
albanx
5

Если вы делаете что-то с помощью скрипта, один простой способ навсегда установить переменную окружения - поместить в ваш скрипт оператор ниже,

if [[ ! -d "$MyVar" ]]; then 
    export MyVar="abc"
    echo 'export MyVar="abc"' >> ~/.bashrc
fi

Если вам нужно вычислить выражения типа pwd, вы можете использовать это, например,

echo "export EIGEN_ROOT=\"$(pwd)/eigen\"" >> ~/.bashrc
Шиталь шах
источник
1

Я знаю, что уже довольно поздно, но если вы хотите добавить переменную окружения для всех пользователей (например, использование JAVA) - вы можете сделать следующее:

1) Открывать /etc/bash.bashrcс помощью nano (вы можете использовать любой редактор, я не предпочитаю VIM, так как это хуже всего, когда дело касается дружелюбия пользователя - ничего личного).

2) Добавить в файл:

export VAR=path export PATH=$PATH:/bin 3) (Лучше, если вы можете сбросить флажок) - или просто открыть новый сеанс SSH и подтвердить с помощью команды `env '.

НО, если вы хотите, чтобы у каждого пользователя была отдельная настройка для этого, вы должны внести изменения (по сценарию) в .bashrcфайл ~/.bashrc(или, /home/$USER/если вы новичок в системах Linux)

ha9u63ar
источник