К сожалению, нет полностью переносимого места для установки переменных среды. Два файла, которые наиболее близки ~/.profile
, - это традиционное местоположение, которое работает во многих установках, и ~/.pam_environment
современная, распространенная, но ограниченная альтернатива.
Что положить в ~/.pam_environment
Файл ~/.pam_environment
читается всеми методами входа в систему, которые используют PAM и у которых этот файл включен. Это охватывает большинство систем Linux в настоящее время.
Основным преимуществом ~/.pam_environment
является то, что (когда он включен) он читается до запуска оболочки пользователя, поэтому он работает независимо от типа сеанса, оболочки входа в систему и других сложностей. Это даже работает для неинтерактивных логинов, таких как su -c somecommand
и ssh somecommand
.
Основным ограничением ~/.pam_environment
является то, что вы можете размещать только простые назначения, а не сложный синтаксис оболочки. Синтаксис этого файла следующий.
- Файлы анализируются построчно.
- Ведущие пробелы игнорируются.
- Вы можете по желанию начинать строки с
export
одного пробела (не табуляция, иди рисунок).
- После этого каждая строка должна иметь форму, в
VAR=VALUE
которой VAR состоит из букв, цифр и подчеркиваний.
#
начинается комментарий, он не может появиться в значении.
- Если VALUE начинается с
'
или "
и содержит другую идентичную кавычку, тогда VAR устанавливается на строку между кавычками (все, что находится после второй кавычки, игнорируется). В противном случае VAR устанавливается на строку после =
знака.
- Если нет
=
, переменная удаляется из среды.
Таким образом, ~/.pam_environment
с другой стороны, работает в большом количестве обстоятельств. С другой стороны, у вас не может быть никаких динамических настроек, таких как основание значения переменной на другой переменной (например, добавление каталога в PATH) или использование вывода команды (например, проверка наличия каталога или программы), а также некоторые символы ( #'"
, перевод строки) невозможно или затруднить в значении.
Что положить в ~/.profile
Этот файл должен иметь переносимый (POSIX) синтаксис sh. Используйте расширения ksh или bash (массивы [[ … ]]
и т. Д.) Только в том случае, если вы знаете, что в вашей системе такие оболочки есть /bin/sh
.
Этот файл может быть прочитан скриптами в автоматизированных приложениях, поэтому он не должен вызывать программы, которые производят какой-либо вывод или вызов exec
. Если вы хотите сделать это при входе в текстовый режим, делайте это только для интерактивных оболочек. Пример:
case $- in *i*)
# Display a message if I have new mail
if mail -e; then echo 'You have new mail'; fi
# If zsh is available, and this looks like a text-mode login, run zsh
case "`ps $PPID` " in
*" login "*)
if type zsh >/dev/null 2>/dev/null; then exec zsh; fi;;
esac
esac
Это пример использования /bin/sh
вашей оболочки входа в систему и переключения на вашу любимую оболочку. Смотрите также, как я могу использовать bash в качестве оболочки для входа в систему, когда мой системный администратор отказывается разрешить мне изменить его
Когда ~/.profile
не читается при неграфическом входе в систему?
Различные логины читают разные файлы.
Если ваш логин оболочки bash
Bash читает ~/.bash_login
или, ~/.bash_profile
если они существуют вместо ~/.profile
. Также bash не читает ~/.bashrc
в логине, даже если он интерактивный. Чтобы никогда больше не запоминать эти причуды, создайте ~/.bash_profile
строку со следующими двумя строками:
. ~/.profile
case $- in *i*) . ~/.bashrc;; esac
См. Также Какие файлы установки следует использовать для настройки переменных среды с помощью bash?
Если ваш логин оболочки zsh
Зш читает ~/.zprofile
и ~/.zlogin
, но нет ~/.profile
. Zsh имеет синтаксис, отличный от sh, но может читать ~/.profile
в режиме эмуляции sh. Вы можете использовать это для ~/.zprofile
:
emulate sh -c '. ~/.profile'
Смотрите также Zsh, не попадающий в ~ / .profile
Если ваша оболочка входа в систему является другой оболочкой
Там мало что можно сделать, за исключением использования в /bin/sh
качестве оболочки для входа и вашей любимой оболочки (например, fish) только в качестве интерактивной оболочки. Вот что я делаю с Zsh. Смотрите выше пример вызова другой оболочки из ~/.profile
.
Удаленные команды
При вызове удаленной команды без прохождения через интерактивную оболочку не все оболочки читают файл запуска.
Ksh читает файл, указанный в ENV
переменной, если вам удастся передать его.
Bash читает, ~/.bashrc
если он не интерактивный (!) И его родительский процесс вызывается rshd
или sshd
. Таким образом, вы можете начать ~/.bashrc
с
if [[ $- != *i* ]]; then
. ~/.profile
return
fi
Zsh всегда читает, ~/.zshenv
когда начинается. Используйте с осторожностью, так как это читается каждым экземпляром zsh, даже если это подоболочка, где вы устанавливали другие переменные. Если zsh - это ваша оболочка входа в систему, и вы хотите использовать ее для установки переменных только для удаленных команд, используйте guard: установите некоторую переменную ~/.profile
, например MY_ENVIRONMENT_HAS_BEEN_SET=yes
, и проверьте эту защиту перед чтением ~/.profile
.
if [[ -z $MY_ENVIRONMENT_HAS_BEEN_SET ]]; then emulate sh -c '~/.profile'; fi
Случай графических логинов
Многие дистрибутивы, дисплеи диспетчера и среды рабочего стола организованы для запуска ~/.profile
, либо путем явного получения его из сценариев запуска, либо путем запуска оболочки входа.
К сожалению, не существует общего метода обработки комбинаций distro / DM / DE ~/.profile
, которые не читаются.
Если вы используете традиционный сеанс, запущенный с помощью ~/.xsession
, это место, где вы должны установить переменные среды; сделать это путем поиска ~/.profile
(то есть . ~/.profile
). Обратите внимание, что при некоторых настройках сценарии запуска среды рабочего стола будут исходить ~/.profile
снова.