Каков наилучший способ дистрибутива / оболочки-агностик для установки переменных среды?
Вопрос говорит все. В настоящее время я использую Arch Linux и zsh, но мне бы хотелось, чтобы решение, которое (как минимум) работает как на VT, так и в xterms, а также (надеюсь, желательно), будет продолжать работать, если я переключу дистрибутивы или оболочки.
Я слышал дико разрозненные ответы на этот вопрос в документах разных дистрибутивов. Ubuntu говорит: «Используйте .pam_environment». Я думаю, что в Arch, что они рекомендуют, зависит от вашей оболочки. В настоящее время я помещаю все в .profile, и если оболочка не по каким-то причинам не возникает (например, bash, если существует файл .bash_profile), я переопределяю это, вручную используя его. Но похоже, что должен быть лучший способ.
- Разделить файлы с помощью awk и сгенерировать результаты в другом каталоге
- Зарезервированные символы в именах файлов
- Регулярное выражение с использованием \\ vs с использованием \
- chown все файлы на основе шаблона имени файла в текущем каталоге
- Использование cat для модификации ~ / .bash_profile, кажется, удаляет __git_ps1
3 Solutions collect form web for “Каков наилучший способ дистрибутива / оболочки-агностик для установки переменных среды?”
К сожалению, нет полностью переносного места для установки переменных окружения. Два наиболее близких к ним файла – ~/.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
Zsh читает ~/.zprofile
и ~/.zlogin
, но не ~/.profile
. Zsh имеет другой синтаксис sh, но может читать ~/.profile
в режиме эмуляции sh. Вы можете использовать это для своего ~/.zprofile
:
emulate sh -c '. ~/.profile'
См. Также Zsh не попадание ~ / .profile
Если ваша оболочка для входа – это другая оболочка
Там мало что можно сделать, не используя /bin/sh
качестве вашей оболочки входа и вашей любимой оболочки (например, рыбы) только в качестве интерактивной оболочки. Это то, что я делаю с zsh. См. Выше пример вызова другой оболочки из ~/.profile
.
Удаленные команды
При вызове удаленной команды, не проходя через интерактивную оболочку, не все оболочки читают загрузочный файл.
Ksh считывает файл, указанный переменной ENV
, если вам удастся передать его.
Bash читает ~/.bashrc
если он не является интерактивным (!), А его родительский процесс называется rshd
или sshd
. Таким образом, вы можете запустить свой ~/.bashrc
с помощью
if [[ $- != *i* ]]; then . ~/.profile return fi
Zsh всегда читает ~/.zshenv
когда он начинается. Используйте это с осторожностью, так как это читается каждым экземпляром zsh, даже если это подоболочка, где вы задали другие переменные. Если zsh является вашей оболочкой входа и вы хотите использовать ее для установки переменных только для удаленных команд, используйте защитный MY_ENVIRONMENT_HAS_BEEN_SET=yes
: установите некоторую переменную в ~/.profile
, например MY_ENVIRONMENT_HAS_BEEN_SET=yes
, и проверьте этот защитный 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
). Обратите внимание, что в некоторых настройках сценарии запуска среды рабочего стола снова будут обновлены ~/.profile
.
Насколько я знаю, нет никакого агротического стандарта дистрибутива и оболочки, как устанавливать переменные среды.
Наиболее распространенным стандартом de facto является /etc/profile
и ~/.profile
. Вторым наиболее распространенным явлением является /etc/environment
и ~/.pam_environment
.
Мне кажется, что все документы, которые я нашел, вы уже нашли. Я перечисляю их здесь так или иначе для других читателей.
- Debian рекомендует
/etc/profile
и~/.profile
( ссылка ). - Ubuntu рекомендует
/etc/environment
и~/.pam_environment
( ссылка ). - Arch Linux упоминает, в частности,
/etc/profile
и/etc/environment
( link ).
Бонус: текст, задающий вопрос об использовании и / или неправильном использовании /etc/environment
в debian ( ссылка , последнее обновление 2008).
Я добавил следующий скрипт ~ / bin / agnostic_setenv:
#!/bin/csh -f set args = ($*) if ($#args == 1) then echo "export $args[1]=" exit 0 endif if ($#args == 2) then if ("$args[1]" =~ *csh*) then echo "setenv $args[2]" exit 0 else echo "export $args[1]=$args[2]" exit 0 endif endif echo "setenv $args[2] $args[3]"
И в ~ / .perl-homedir я использую:
eval `${HOME}/bin/agnostic_setenv $shell PERL_HOMEDIR 0`
Симиарный скрипт для agnostic_unsetenv:
#!/bin/csh -f set args = ($*) if ($#args == 1) then echo "export $args[1]" exit 0 endif echo "unsetenv $args[2]" exit 0