К сожалению, нет полностью переносимого места для установки переменных среды. Два файла, которые наиболее близки ~/.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снова.