Как установить переменную среды пользователя? (постоянно, а не сессия)

145

Это меня раздражает. Я видел несколько предложений (все с использованием разных файлов и синтаксиса), и ни одно из них не сработало.

Как установить переменную среды для конкретного пользователя? Я нахожусь на сжатии Debian. Какой точный синтаксис я должен указать в файле, чтобы ABC = "123"?

жилль
источник
7
Что ты уже пробовал?
10
1
редактирование .bashrc, .bash_profile, .profile и .ssh / eviroment. Хотя я не знаю, написал ли я это в правильном месте или имел правильный синтаксис каждый раз
4
.bashrcэто главное место для этого.
rozcietrzewiacz
@rozcietrzewiacz: хорошо, но ... даже после того, как я нашел решение, я попытался установить ABC1 и ABC2 в начале и конце этого файла, и он не установлен в моей среде.
1
Проверьте, что .bash_profileсодержит что-то вроде [[ -f ~/.bashrc ]] && . ~/.bashrc.
rozcietrzewiacz

Ответы:

113

Вы должны поместить объявление в файлы инициализации вашей оболочки:

  • Если вы используете bash, ash, ksh или другую оболочку в стиле Bourne, вы можете добавить

    ABC="123"; export ABC
    

    в вашем .profileфайле ( ${HOME}/.profile). Это ситуация по умолчанию в большинстве установок Unix, в частности в Debian.

    Если ваша оболочка входа в систему bash, вы можете использовать .bash_profile( ${HOME}/.bash_profile) или .bash_loginвместо.

    Примечание. Если какой-либо из этих файлов существует, и ваша оболочка входа - bash, .profileона не читается при входе в систему через ssh или в текстовой консоли, но она все равно может быть прочитана вместо .bash_profileвхода в систему из графического интерфейса. Также, если нет .bash_profile, то используйте .bashrc.

  • Если вы установили zsh в качестве оболочки для входа, используйте ~/.zprofileвместо ~/.profile.

  • Если вы используете tcsh, добавьте

    setenv ABC "123"
    

    в .loginфайле ( ${HOME}/.login)

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

Matteo
источник
5
Поведение по умолчанию su userзаключается в изменении владельца текущей оболочки на имя пользователя arg, сохраняя при этом домашний каталог и среду вызывающего пользователя. Чтобы войти в оболочку таким образом, чтобы стать новым пользователем и получить все настройки среды ($ PATH, $ HOME, $ ABC и т. Д.), Вам необходимо передать - в качестве первого аргумента su. su - usernameвыполнит то, что вы просите.
Тим Кеннеди
1
Подожди: что ты имеешь в виду под "выходом в root"? В любом случае создание su не инициализирует оболочку. Тебе нужно 'su -' (см. man su)
Маттео
1
Почему ты suв первую очередь? Разве вы не создали корневую систему, .profileкоторая не может быть использована пользователем?
rozcietrzewiacz
1
@acid это то, что должно было быть сделано. Вопрос в том, что происходит при входе в систему. Чтобы проверить это, сначала выйдите из системы .
rozcietrzewiacz
7
Поскольку .profileон читается всеми Bourne-совместимыми оболочками, вы не должны писать синтаксис Bash в этом файле. В частности, export VARIABLE=valueнуждается в рефакторинге VARIABLE=value; export VARIABLE.
tripleee
48

Используйте /etc/environmentфайл для установки переменных среды. Затем добавьте следующую строку в /etc/environmentфайл.

ABC="123"

Теперь переменная ABC будет доступна из всех пользовательских сессий. Чтобы проверить вывод переменной, сначала обновите переменную среды, используя команду

source /etc/environment

и беги echo $ABC.

Hokam
источник
4
+1 за исходную команду. Это отсутствовало во всех ответах
Nerrve
5
Будьте осторожны, так /etc/environmentкак не поддерживает полный синтаксис bash, что я решил непросто. Например, поставить PATH="/usr/bin:/usr/sbin"и затем выполнить PATH="$PATH:/foo/bar"следующую строку не получится
user2428118
Не уверен, если это личная проблема или что, но мне пришлось перезагрузить ОС после установки этого /etc/environment, даже если я перезапустил терминал Bash или набрал source /etc/environment. Поэтому, если у вас возникают проблемы, когда переменная окружения не сохраняется, попробуйте перезагрузить компьютер.
Blairg23
9

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

path="$(grep $USER /etc/passwd | cut -d ':' -f 7)"
shell="$(basename -- "$path")"

Затем вы должны выяснить, какие точечные файлы обычно читает эта оболочка:

man $shell

Сокращение, которое могло бы работать, должно перечислить те точечные файлы, которые содержат имя оболочки:

ls ~/.*${shell}*

Если вы хотите проверить, действительно ли один из файлов читается во время входа в систему, вы можете просто напечатать имя файла в каждом из них, например:

echo .bashrc

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

Когда дело доходит до объявления переменной «постоянно», обратите внимание, что это распространяется только на сеанс. Нет доступа к значению переменной без сеанса, поэтому он не имеет смысла вне одного. Если вы имеете в виду «только для чтения», это зависит от оболочки, и в Bash вы можете использовать:

declare -r VAR

если оно уже имеет значение, или

declare -r VAR=value

назначить его одновременно. Не все оболочки имеют эту функцию.

Чтобы объявить переменную в большинстве оболочек, вы должны использовать имя переменной ( [A-Za-z_][A-Za-z0-9_]*), за которым следует знак равенства ( без пробелов вокруг знака равенства), а затем значение (желательно заключенное в кавычки, если значение не является простым [A-Za-z0-9_]+). Например:

name="John Doe"
ip=127.0.0.1
HORRIBLE=1
l0b0
источник
5

Используйте экспорт.

export ABC="123"

Чтобы проверить, установлен ли он, используйте

env

и / или

env | grep ABC

Чтобы добавить его навсегда, добавьте его в свой ~/.bashrcфайл.

export ABC="123"
кто я
источник
6
Он хочет знать горячее, чтобы определить его постоянно , т. Е. В какой файл поместить определение.
Маттео
1
Не работает Как только я выйду из системы, переменная исчезнет. Мне это нужно между сессиями
1
Вы имеете в виду, permenateа не permenently: D
Whoami
посмотрите на редактированиеbashrc
whoami
5
что permenate? ты имеешь ввиду permanent?
SSH это
3

Точная команда:

echo 'export ABC = "123"' >> ~/.profile
Иван Бишевац
источник
4
Именно так? Шутки в сторону? Какая оболочка (а) читает ~/.profileи (б) оставляет место до и после =?
G-Man
1

Лучший способ, который мне помог, - это изменение файла .bashrc в оболочке BASH.

используйте это, например:

  1. откройте ваш .bashrc файл
  2. добавьте эту строку:

    export <VARIABLE> = "<ANY PATH/VALUE you want>"
    

    например: export HOME = "/home/user/"

    Не забудьте использовать, ""поскольку использование ' 'не будет работать, и ваш файл bashrc сообщит об ошибке во время поиска.

  3. источник в текущей сессии.

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

Аюши Агарвал
источник