Каков наилучший способ дистрибутива / оболочки-агностик для установки переменных среды?

Вопрос говорит все. В настоящее время я использую Arch Linux и zsh, но мне бы хотелось, чтобы решение, которое (как минимум) работает как на VT, так и в xterms, а также (надеюсь, желательно), будет продолжать работать, если я переключу дистрибутивы или оболочки.

Я слышал дико разрозненные ответы на этот вопрос в документах разных дистрибутивов. Ubuntu говорит: «Используйте .pam_environment». Я думаю, что в Arch, что они рекомендуют, зависит от вашей оболочки. В настоящее время я помещаю все в .profile, и если оболочка не по каким-то причинам не возникает (например, bash, если существует файл .bash_profile), я переопределяю это, вручную используя его. Но похоже, что должен быть лучший способ.

  • Загрузите и установите последний пакет deb из github через терминал
  • Solaris «чистые» групповые файлы (или, в любом случае, любой текстовый файл)
  • Xargs и rm с a *
  • Как вычислить имя файла эскиза из оболочки?
  • Как добавить псевдоним для моего pwd в существующий файл?
  • В чем разница между «du -sh *» и «du -sh ./*»?
  • Какие символы нужно избегать в файлах без кавычек?
  • Переименование содержимого всей папки
  • 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 
    Linux и Unix - лучшая ОС в мире.