Як додати змінні середовища?


364

Я запускаю Ubuntu 11.04. Я використовую термінал для запуску bash сесії, і я хочу додати змінну середовища:

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

Але це не працює. Він показує всі змінні з THEVAR бути останнім, але ще один виклик, щоб envНЕ показувати THEVARanymore- env | grep THEVARповертає нічого.

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

Я знаю, що роблю щось не так, я знаю, що це повинно бути щось просте, але я просто не можу знайти що.

ОНОВЛЕННЯ: Справжнє значення мого запитання було таким: https://stackoverflow.com/questions/496702/can-a-shell-script-set-environment-variables-of-the-calling-shell

(У будь-якому випадку я виберу найвідповідальнішу відповідь і залишу відредагований заголовок - це не те, про що я питав)

env запускає програму в модифікованому середовищі, після чого відхиляє всі зміни.


1
Коли це визначено / експортовано в .bashrc, воно працює належним чином.
huff


1
Як щодо THEVAR=/example?
Олег Припін

2
Інша стосується глобальних змінних, ця не додає такого обмеження. Я б тримав це окремо.
Лекенштейн

Відповіді:


570

Щоб встановити змінну лише для поточної оболонки:

VARNAME="my value"

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

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

Щоб встановити його назавжди для всіх майбутніх сеансів bash, додайте такий рядок у свій .bashrcфайл у своєму $HOMEкаталозі.

Щоб встановити його постійно і в системному режимі (всі користувачі, усі процеси) додайте змінну набору в / 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 так, це, мабуть, розумне місце
Michał Šrajer

1
@BharadwajRaju, оскільки в деяких старих системах UNIX можна експортувати лише встановлену вже змінну. Наприклад, старий Solaris та HP-UX.
Michał Šrajer

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- bash-script / 176788 # 176788


4
Як я можу змусити його працювати лише виконанням сценарію? Без джерела.
Мітрил

19

Щоб назавжди додати нову змінну середовища в Ubuntu (перевірена лише в 14.04), виконайте наступні дії:

  1. Відкрити термінал (натискаючи CtrlAltT)
  2. sudo -H gedit /etc/environment
  3. Введіть свій пароль
  4. Відредагуйте щойно відкритий текстовий файл:
    наприклад, якщо ви хочете додати FOO=bar, тоді просто напишіть FOO=barу новому рядку
  5. Збережи це
  6. Після збереження вийдіть із системи та увійдіть знову.
  7. Необхідні зміни внесені.

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

Джерело буде виконувати команди в скрипті так, ніби ви їх ввели ... так що це змінює деякі аспекти сценарію, наприклад, вихід ... так що, якщо ваш скрипт щось перевіряє і вирішує вийти, якщо помилковий, наприклад, за допомогою виклику exit 0він припинить ваш поточний сеанс терміналу / оболонки.


Це дуже давнє запитання, на яке вже є прийнята відповідь та кілька інших ... Поміркуйте, відповідаючи на новіші запитання, будь ласка ...
NerdOfCode

3
@NerdOfCode ця відповідь стосується проблеми, яка залишається актуальною, і жодна з інших відповідей, включаючи прийняту, згадує її, наскільки я бачу ... Насправді є два значки для надання хороших відповідей на старі питання, тож це заохочується
Занна

1
Це точно, що я шукав. Мені потрібно було переглянути сценарій, експортовані змінні зі сценарію.
альбанкс

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)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.