Каков лучший distro/shell-agnostic способ установить переменные среды?

Заключение в кавычки Википедии:

Схема URI файла является схемой URI, указанной в RFC 1630 и RFC 1738, обычно используемом для получения файлов из собственного компьютера.

и RFC 1738:

Схема URL файла используется для обозначения файлов доступными на конкретном главном компьютере. Эта схема, в отличие от большинства других схем URL, не определяет ресурс, который универсально доступен по Интернету.

URL файла принимает форму: file://host/path

где хост является полностью определенным доменным именем системы на который path доступно, и path иерархический путь к каталогу формы directory>/directory/.../name.

Как особый случай, host может быть строка localhost или пустая строка; это интерпретируется как 'машина, от которой интерпретируется URL'.

Большая часть поддержки браузеров file:// URI, co можно открыть файл от диска при помощи их на адресной строке браузера.

Я не думаю это application:// URI является standarized - нет никакой информации об этом на Википедию и в RFC на сайте IETF и в сайте IANA, таким образом, использование этой схемы URI довольно специализировано и разработано для приложения внутренние потребности.

31
26.08.2013, 21:44
4 ответа

Нет, к сожалению, никакого полностью портативного местоположения для установки переменных среды. Два файла, которые прибывают самые близкие, ~/.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 работы в большом массиве обстоятельств. На оборотной стороне Вы не можете иметь никаких динамических настроек, таких как основа значение переменной на другой переменной (например, добавление каталога для СОЕДИНЕНИЯ КАНАЛОМ) или использовать вывод команды (например, протестировать, если каталог или программа присутствуют), и некоторые символы (#'", новая строка), невозможны или неприятны, чтобы вставить значение.

Что вставить ~/.profile

Этот файл должен иметь портативный (POSIX) sh синтаксис. Только используйте ksh или колотите расширения (массивы, [[ … ]], и т.д.), если Вы знаете, что Ваша система имеет эти оболочки как /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 как Ваша оболочка входа в систему и переключающийся на Вашу любимую оболочку. См. также, как я могу использовать удар в качестве своей оболочки входа в систему, когда мой системный администратор отказывается позволять мне изменить его

Когда ~/.profile не чтение на неграфическом входе в систему?

Различные оболочки входа в систему читают различные файлы.

Если Ваша оболочка входа в систему является ударом

Чтения Bash ~/.bash_login или ~/.bash_profile если они существуют вместо ~/.profile. Также удар не читает ~/.bashrc в оболочке входа в систему, даже если это является интерактивным. Для никогда не запоминания этих причуд снова создайте a ~/.bash_profile со следующими двумя строками:

. ~/.profile
case $- in *i*) . ~/.bashrc;; esac

См. также, Какие файлы настройки должны использоваться для установки переменных среды с ударом?

Если Ваша оболочка входа в систему является 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 является Вашей оболочкой входа в систему, и Вы хотите использовать его, чтобы установить переменные только для удаленных команд, использовать защиту: установите некоторую переменную в ~/.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 снова.

29
27.01.2020, 19:38
  • 1
    , что делает case $- in *i*) ? –  qodeninja 05.02.2014, 02:04
  • 2
    @qodeninja Выполняет следующие инструкции (пока соответствие ;; или esac) если $- соответствует шаблону *i*, т.е. если $- содержит i, т.е. если оболочка является интерактивной. Достаточно ярмарка –  Gilles 'SO- stop being evil' 05.02.2014, 02:06
  • 3
    $- строка установленных в настоящее время опций оболочки. (как set -x). i означает интерактивную оболочку. –  Peter Cordes 19.04.2015, 18:12
  • 4
    Не Можете Вы просто получить общий файл, сказать ~/.config/env, даже без эмуляции? большое спасибо –  Kevin Suttle 29.12.2015, 23:34
  • 5
    @StéphaneChazelas Это - пуристское представление. Я сохраняю мой .profile совместимый с довольно старыми Оболочками Bourne, но я распознаю, что некоторые люди просто не заботятся. У меня ничего нет против людей, предполагающих, что sh = колотят за свои собственные файлы, я только забочусь, публикуют ли они #!/bin/sh сценарий, которые используют функции удара. –  Gilles 'SO- stop being evil' 03.08.2017, 19:53

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

Наиболее распространенный и фактический стандарт, кажется, /etc/profile и ~/.profile. Второе наиболее распространенное, кажется, /etc/environment и ~/.pam_environment.

Мне кажется, что вся документация, что я нашел Вас также уже, показала. Я перечисляю их здесь так или иначе для других читателей.

  • Debian рекомендует /etc/profile и ~/.profile (ссылка).
  • Ubuntu рекомендует /etc/environment и ~/.pam_environment (ссылка).
  • Дуга упоминания Linux, среди других, /etc/profile и /etc/environment (ссылка).

Премия: текст, подвергающий сомнению использование и/или неправильное употребление /etc/environment в debian (ссылка, последнее обновление 2008).

4
27.01.2020, 19:38
  • 1
    Независимо от файла Вы используете Вас, все еще врезался бы в несовместимый синтаксис между различными оболочками. –  Joseph R. 26.08.2013, 16:25
  • 2
    @JosephR. не делайте большинство оболочек сохраняет назад-совместимость с sh? Пока Вы придерживаетесь POSIX, я думал бы, что Вы будете в порядке... –  evilsoup 26.08.2013, 18:56
  • 3
    AFAIK, в котором Вы не можете присвоить переменные csh и друзья POSIX путь (Вам нужно что-то как set или setenv) –  Joseph R. 26.08.2013, 20:22

Я добавил следующий скрипт ~/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`

Аналогичный скрипт для агностиков _unsetenv:

#!/bin/csh -f
set args = ($*)
if ($#args == 1) then
   echo "export $args[1]"
   exit 0
endif

echo "unsetenv $args[2]"
exit 0
0
20.08.2021, 13:06

Если вы используете systemd -homed , вы должны иметь возможность использоватьhomectlдля установки переменных среды для вашей учетной записи пользователя независимо от вашей оболочки. Следующая команда устанавливает переменную среды EDITORтаким образом.

homectl update username --setenv=EDITOR=/usr/bin/vim
0
20.08.2021, 13:06

Теги

Похожие вопросы