Вопрос говорит обо всем. В настоящее время я использую Arch Linux и zsh, но мне бы хотелось, чтобы решение, которое (как минимум) работало как на VT, так и на xterms, а также (надеюсь, желательно) продолжало бы работать, если я переключаю дистрибутивы или оболочки.
Я слышал дико разрозненные ответы на этот вопрос в разных документах дистрибутивов. Ubuntu говорит "использовать .pam_environment". Я думаю, в Arch, что они рекомендуют, зависит от вашей оболочки. В настоящее время я помещаю все в .profile и, если по какой-то причине оболочка не получает его (например, bash, если существует .bash_profile), я переопределяю это, используя его вручную. Но похоже, что должен быть лучший путь.
shell
environment-variables
login
strugee
источник
источник
Ответы:
К сожалению, нет полностью переносимого места для установки переменных среды. Два файла, которые наиболее близки
~/.profile
, - это традиционное местоположение, которое работает во многих установках, и~/.pam_environment
современная, распространенная, но ограниченная альтернатива.Что положить в
~/.pam_environment
Файл
~/.pam_environment
читается всеми методами входа в систему, которые используют PAM и у которых этот файл включен. Это охватывает большинство систем Linux в настоящее время.Основным преимуществом
~/.pam_environment
является то, что (когда он включен) он читается до запуска оболочки пользователя, поэтому он работает независимо от типа сеанса, оболочки входа в систему и других сложностей. Это даже работает для неинтерактивных логинов, таких какsu -c somecommand
иssh somecommand
.Основным ограничением
~/.pam_environment
является то, что вы можете размещать только простые назначения, а не сложный синтаксис оболочки. Синтаксис этого файла следующий.export
одного пробела (не табуляция, иди рисунок).VAR=VALUE
которой VAR состоит из букв, цифр и подчеркиваний.#
начинается комментарий, он не может появиться в значении.'
или"
и содержит другую идентичную кавычку, тогда VAR устанавливается на строку между кавычками (все, что находится после второй кавычки, игнорируется). В противном случае VAR устанавливается на строку после=
знака.=
, переменная удаляется из среды.Таким образом,
~/.pam_environment
с другой стороны, работает в большом количестве обстоятельств. С другой стороны, у вас не может быть никаких динамических настроек, таких как основание значения переменной на другой переменной (например, добавление каталога в PATH) или использование вывода команды (например, проверка наличия каталога или программы), а также некоторые символы (#'"
, перевод строки) невозможно или затруднить в значении.Что положить в
~/.profile
Этот файл должен иметь переносимый (POSIX) синтаксис sh. Используйте расширения ksh или bash (массивы
[[ … ]]
и т. Д.) Только в том случае, если вы знаете, что в вашей системе такие оболочки есть/bin/sh
.Этот файл может быть прочитан скриптами в автоматизированных приложениях, поэтому он не должен вызывать программы, которые производят какой-либо вывод или вызов
exec
. Если вы хотите сделать это при входе в текстовый режим, делайте это только для интерактивных оболочек. Пример:Это пример использования
/bin/sh
вашей оболочки входа в систему и переключения на вашу любимую оболочку. Смотрите также, как я могу использовать bash в качестве оболочки для входа в систему, когда мой системный администратор отказывается разрешить мне изменить егоКогда
~/.profile
не читается при неграфическом входе в систему?Различные логины читают разные файлы.
Если ваш логин оболочки bash
Bash читает
~/.bash_login
или,~/.bash_profile
если они существуют вместо~/.profile
. Также bash не читает~/.bashrc
в логине, даже если он интерактивный. Чтобы никогда больше не запоминать эти причуды, создайте~/.bash_profile
строку со следующими двумя строками:См. Также Какие файлы установки следует использовать для настройки переменных среды с помощью bash?
Если ваш логин оболочки zsh
Зш читает
~/.zprofile
и~/.zlogin
, но нет~/.profile
. Zsh имеет синтаксис, отличный от sh, но может читать~/.profile
в режиме эмуляции sh. Вы можете использовать это для~/.zprofile
:Смотрите также Zsh, не попадающий в ~ / .profile
Если ваша оболочка входа в систему является другой оболочкой
Там мало что можно сделать, за исключением использования в
/bin/sh
качестве оболочки для входа и вашей любимой оболочки (например, fish) только в качестве интерактивной оболочки. Вот что я делаю с Zsh. Смотрите выше пример вызова другой оболочки из~/.profile
.Удаленные команды
При вызове удаленной команды без прохождения через интерактивную оболочку не все оболочки читают файл запуска.
Ksh читает файл, указанный в
ENV
переменной, если вам удастся передать его.Bash читает,
~/.bashrc
если он не интерактивный (!) И его родительский процесс вызываетсяrshd
илиsshd
. Таким образом, вы можете начать~/.bashrc
сZsh всегда читает,
~/.zshenv
когда начинается. Используйте с осторожностью, так как это читается каждым экземпляром zsh, даже если это подоболочка, где вы устанавливали другие переменные. Если zsh - это ваша оболочка входа в систему, и вы хотите использовать ее для установки переменных только для удаленных команд, используйте guard: установите некоторую переменную~/.profile
, напримерMY_ENVIRONMENT_HAS_BEEN_SET=yes
, и проверьте эту защиту перед чтением~/.profile
.Случай графических логинов
Многие дистрибутивы, дисплеи диспетчера и среды рабочего стола организованы для запуска
~/.profile
, либо путем явного получения его из сценариев запуска, либо путем запуска оболочки входа.К сожалению, не существует общего метода обработки комбинаций distro / DM / DE
~/.profile
, которые не читаются.Если вы используете традиционный сеанс, запущенный с помощью
~/.xsession
, это место, где вы должны установить переменные среды; сделать это путем поиска~/.profile
(то есть. ~/.profile
). Обратите внимание, что при некоторых настройках сценарии запуска среды рабочего стола будут исходить~/.profile
снова.источник
case $- in *i*)
?;;
илиesac
), если$-
соответствует шаблону*i*
, т.е. если$-
содержитi
, т.е. если оболочка является интерактивной.$-
является строкой текущих установленных параметров оболочки. (какset -x
)i
означает интерактивную оболочку.~/.config/env
, даже без эмуляции?.profile
требования относительно довольно старых оболочек Борна, но я понимаю, что некоторым людям просто все равно. Я ничего не имею против людей, предполагающих, что sh = bash для их собственных файлов, мне важно только, если они опубликуют#!/bin/sh
скрипт, использующий функции bash.Насколько я знаю, не существует никакого независимого от дистрибутива и оболочки стандарта, как устанавливать переменные окружения.
Наиболее распространенным и де-факто стандартом, кажется, является
/etc/profile
и~/.profile
. Вторым наиболее распространенным кажется/etc/environment
и~/.pam_environment
.Мне кажется, что вся документация, которую я вам нашел, тоже уже найдена. Я перечислю их здесь в любом случае для других читателей.
/etc/profile
и~/.profile
( ссылка )./etc/environment
и~/.pam_environment
( ссылка )./etc/profile
и/etc/environment
( ссылка ).Бонус: текст, ставящий под сомнение использование и / или неправильное использование
/etc/environment
в Debian ( ссылка , последнее обновление 2008).источник
sh
? Пока вы придерживаетесь POSIX, я бы подумал, что у вас все будет хорошо ...csh
друзья POSIX (вам нужно что-то вродеset
илиsetenv
)Я добавил следующий скрипт ~ / bin / agnostic_setenv:
И в ~ / .perl-homedir я использую:
Примерный скрипт для agnostic_unsetenv:
источник