Установка переменной PATH в / etc / environment vs .profile

21

Где предпочтительное место для установки PATH envvar?

~/.profile или /etc/environment ?

В том случае, когда PATH установлено в обоих местах? Является ли конечный результат конкатенацией обоих значений, установленных в этих двух местах?

    
задан pkaramol 30.12.2016 в 14:45
источник

4 ответа

30

Резюме:

  • Если вы хотите добавить путь (например, /your/additional/path ) к переменной PATH только для вашего текущего пользователя, а не для всех пользователей вашего компьютера, вы обычно ставите его в конце ~/.profile , как в одном этих двух примеров:

    PATH="/your/additional/path:$PATH"
    PATH="$PATH:/your/additional/path"
    

    Обратите внимание, что приоритеты пути спускаются слева направо, поэтому первый путь имеет наивысший приоритет. Если вы добавите свой путь слева от $PATH , он будет иметь наивысший приоритет, а исполняемые файлы в этом месте переопределяют все остальные. Если вы добавите свой путь справа, он будет иметь самый низкий приоритет, а исполняемые файлы из других мест будут предпочтительнее.

  • Однако, если вам нужно установить эту переменную среды для всех пользователей, я бы по-прежнему не рекомендовал касаться /etc/environment , но создав файл с именем файла, заканчивающимся на .sh в /etc/profile.d/ . Скрипт /etc/profile и все скрипты в /etc/profile.d являются глобальным эквивалентом личного пользователя ~/.profile каждого пользователя и выполняются как обычные сценарии оболочки всеми командами во время их инициализации.

Подробнее:

  • /etc/environment - это системный файл конфигурации, что означает, что он используется всеми пользователями. Он принадлежит root , поэтому вам нужно быть администратором и использовать sudo для его изменения.

  • ~/.profile - это собственный скрипт инициализации вашего собственного пользователя. Каждый пользователь имеет один и может редактировать свой файл, не затрагивая других.

  • /etc/profile и /etc/profile.d/*.sh - это глобальные сценарии инициализации, эквивалентные ~/.profile для каждого пользователя. Однако глобальные скрипты выполняются до пользовательских сценариев; и основной /etc/profile выполняет все скрипты *.sh в /etc/profile.d/ перед тем, как он выйдет.

  • Файл /etc/environment обычно содержит только эту строку:

    PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
    

    Он устанавливает для переменной PATH для всех пользователей системы значение по умолчанию, которое не следует изменять основным способом. По крайней мере, вы не должны удалять из него важные пути, такие как /bin , /sbin , /usr/bin и /usr/sbin .

    Этот файл читается как один из первых файлов конфигурации каждой оболочкой каждого пользователя. Обратите внимание, что это не сценарий оболочки . Это просто файл конфигурации, который каким-то образом разбирается и может содержать только назначения переменных среды!

  • Файл ~/.profile может содержать много вещей, по умолчанию он содержит среди других вещей проверку того, существует ли каталог ~/bin и добавляет его к существующей переменной PATH пользователя, как это (на более ранних версиях Ubuntu до 16.04 - новые версии добавляют его безоговорочно):

    # set PATH so it includes user's private bin if it exists
    if [ -d "$HOME/bin" ] ; then
        PATH="$HOME/bin:$PATH"
    fi
    

    Вы видите, что старое значение PATH снова используется здесь, и новый путь добавляется только к началу, а не к перезаписыванию всего. Когда вы вручную хотите добавить новые пути, вы также должны всегда хранить старое значение $PATH где-то в новой строке.

    Этот скрипт инициализации читается только оболочками пользователя, к которому он принадлежит, но есть еще одно условие:

    # ~/.profile: executed by the command interpreter for login shells.
    # This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
    # exists.
    

    Итак, если вы используете оболочку Bash по умолчанию, вы должны убедиться, что у вас нет ~/.bash_profile или ~/.bash_login , если вы хотите, чтобы изменения в ~/.profile имели эффект для вашего пользователя.

Связанный с этим вопрос: разница между файлом bash.bashrc и / etc / environment

    
ответ дан Byte Commander 30.12.2016 в 15:10
источник
10
  

Этот ответ в основном относится к порядку, в котором переменные среды, такие как PATH , назначаются , если они указаны в разных конфигурационных файлах. Я также расскажу о том, где вы должны их обычно устанавливать, но приведенный ниже список не отображает файлы в том порядке, в котором вы должны их использовать. Для общей информации об установке PATH и других переменных среды в Ubuntu я также рекомендую читать EnvironmentVariables и другие ответы на этот вопрос.

Предпочтительное место для установки PATH зависит от , для каких пользователей вам нужно установить его, и , когда и как вы хотите его установить. Часть вашего решения будет заключаться в том, хотите ли вы, чтобы переменная среды была установлена ​​для всех пользователей или для каждого пользователя. Если вы не уверены, я рекомендую установить его только для одного пользователя (например, вашей учетной записи), а не для всей системы.

Как AlexP говорит , PATH будет иметь значение , которое было недавно назначено . На практике наиболее того времени, когда вы устанавливаете PATH , вы добавляете значение old PATH в новое значение, чтобы предыдущие записи сохранялись.

Таким образом, на практике, когда PATH задается из нескольких файлов, оно обычно содержит записи, указанные во всех файлах. Но это происходит только потому, что все файлы, которые его устанавливают, кроме первого, обычно ссылаются на переменную PATH , в результате чего ее старое значение будет добавлено в новое.

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

Обычные места общего назначения для установки PATH перечислены ниже в том порядке, в котором они вступают в силу, когда пользователь входит в систему, не в том порядке, в котором вы обычно должны использовать их . Каждое из перечисленных ниже мест является разумным выбором для установки PATH в некоторых ситуациях , но большинство из них являются хорошим выбором большую часть времени.

В приведенном ниже списке вы увидите некоторые имена каталогов, такие как ~/.profile . Если вы не знакомы с расширением тильды , ~/ ссылается на домашний каталог текущего пользователя. В основном я использую этот синтаксис для компактности. Он поддерживается в сценариях оболочки, но not в файлах конфигурации PAM.

1. Для всех пользователей: /etc/environment

PAM в Ubuntu заставляет переменные среды, перечисленные в /etc/environment , быть установлены, если этот файл существует, который по умолчанию оно делает. Вот как обычно устанавливаются переменные среды для всех пользователей.

$ cat /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"

Если вы должны установить переменные среды для учетных записей all , а не только для своей учетной записи пользователя, то, вероятно, ваш файл будет лучше всего изменен. Я рекомендую сначала выполнить резервное копирование. Один из способов резервного копирования этого файла - запустить:

sudo cp /etc/environment /etc/environment.orig

Расширение .orig специально не требуется - вы можете чувствовать себя хорошо, именовав файл резервной копии тем, что не запутывает или уже используется. (Кроме того, .orig , .old , .backup и .bak являются общими.)

Вы можете отредактировать этот файл любым из способов, которыми вы можете редактировать любой другой файл в качестве пользователя root ( sudoedit /etc/enviromnment , sudo nano -w /etc/environment , gksudo gedit /etc/environment и т. д.)

/etc/environment не поддерживает автоматическое включение старого значения переменной. Но это обычно не нужно, так как большую часть времени вы должны установить переменную среды для всех пользователей, отредактировав /etc/environment , вы хотите, чтобы это было ее начальным значением, когда пользователь входит в систему. Пользователь может изменить его по своему усмотрению. Как правило, это удобно для пользователей.

2. Для всех пользователей: /etc/security/pam_env.conf

PAM считывает переменные среды для всех пользователей из /etc/security/pam_env.conf , указанных с тем же синтаксисом, что и в файлах ~/.pam_environment для каждого пользователя. ().

Когда одна и та же переменная среды устанавливается как в /etc/environment , так и в /etc/security/pam_env.conf , используется значение в pam_env.conf , даже если это значение указано как DEFAULT , а не OVERRIDE .

Однако, когда вы заменяете строку в environment с одним в pam_env.conf , вы можете включить содержимое замененного значения. Подробнее см. В разделе ниже .pam_environment (так как он использует тот же синтаксис).

Обычно нет необходимости редактировать pam_env.conf и , вы должны быть очень осторожны, если вы делаете , поскольку строка malformed обычно препятствует регистрации всех обычных учетных записей пользователей вообще! Например, значение по умолчанию pam_env.conf содержит строки:

#PATH           DEFAULT=${HOME}/bin:/usr/local/bin:/bin\
#:/usr/bin:/usr/local/bin/X11:/usr/bin/X11

Это представлено в качестве одного из нескольких примеров. Одна из особенностей, которую он иллюстрирует, заключается в том, как разделить назначение на несколько строк с \ .Предположим, вы должны раскомментировать только первую строчку, но забыл раскомментировать вторую строку:

PATH           DEFAULT=${HOME}/bin:/usr/local/bin:/bin\
#:/usr/bin:/usr/local/bin/X11:/usr/bin/X11

Не делайте этого!

Я просто испытал это сам случайно, и это предотвратило успешную регистрацию всех пользователей. Чтобы исправить это, мне пришлось загрузиться в режиме восстановления и изменить его. (К счастью, я сделал это на виртуальной машине, которую я использую только для тестирования вещей, поэтому это не вызвало у меня никаких проблем.)

3. Для одного пользователя: .pam_environment в домашнем каталоге пользователя

Лучший способ установить переменную среды для одного пользователя может быть для этого пользователя для редактирования (или создания) .pam_environment в своем домашнем каталоге. Значения, установленные в этом файле, заменяют значения, установленные в глобальном файле /etc/environment .

.pam_environment не является частью скелета файлов, которые копируются в домашнюю папку пользователя при первоначальной создании учетной записи пользователя. Однако, если вы создадите этот файл в своем домашнем каталоге, вы можете использовать его для установки переменных среды, таких как PATH . В отличие от /etc/environment (но, как и /etc/security/pam_env.conf ), файлы .pam_environment для каждого пользователя поддерживают расширение старого значения переменной среды в новую. Однако они не являются сценариями оболочки, и для этого вы должны использовать специальный синтаксис, который несколько отличается от синтаксиса, который вы будете использовать в файле, например .profile .

Например, если у вас есть каталог bin2 в вашем домашнем каталоге, который вы хотите добавить в конец PATH , вы можете сделать это, добавив эту строку в .pam_environment :

PATH DEFAULT=${PATH}:/home/@{PAM_USER}/bin2

Смотрите подраздел ~/.pam_environment EnvironmentVariables (из которых приведен пример вышеприведенного примера), man pam_env и man pam_env.conf для более подробной информации.

Хотя это широко рекомендуется в качестве основного способа для пользователей изменять или добавлять переменные среды, , вы должны быть осторожны при редактировании .pam_environment . Как и изменения в системном /etc/security/pam_env.so (см. Выше), некорректная строка в файле .pam_environment пользователя предотвратит успешное выполнение логинов. (Я проверил это - специально на этот раз.)

Такая ошибка гораздо менее серьезна, вообще , чем некорректная строка в pam_env.so , потому что она затрагивает только одного пользователя. Однако в случае настольной системы Ubuntu с единственной учетной записью пользователя, которая допускает логины, такая ошибка при редактировании .pam_environment будет такой же плохой, как ошибка редактирования pam_env.so - если вы еще не вошли в систему, вы не сможете исправить его без загрузки в режиме восстановления (или с живого USB и т. д.).

(Если у вас есть другие учетные записи пользователей, вы можете войти в систему как другой пользователь и устранить проблему. Даже если они не являются администраторами и не могут использовать sudo для root, они все равно могут выполнять su your-account и быть (не их). Однако учетная запись guest не может этого сделать, так как запрещается использовать su для идентификации личности другого пользователя.)

4. Для всех пользователей: /etc/profile и файлы внутри /etc/profile.d/

Совместимые с Bourne оболочки (в том числе bash , пользовательская оболочка по умолчанию в Ubuntu) запускают команды в /etc/profile при вызове в качестве оболочки входа.

Ubuntu /etc/profile.d заканчивается на:

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

Это вызывает команды в любом файле в каталоге /etc/profile.d/ , чье имя заканчивается в .sh для запуска.

Большинство диспетчеров отображает команды в /etc/profile (и, соответственно, файлы в /etc/profile.d ) для графических логинов. Однако не все, и это важный аргумент в пользу использования возможностей, предоставляемых PAM вместо (см. Выше) - если в этой системе никогда не будет графических логинов, которые могут быть например, если это сервер без установленного графического интерфейса.

Традиционно устанавливать системные переменные среды в /etc/profile , но это часто не лучший выбор. Если вы не можете установить переменную среды в /etc/environment , и вы должны установить ее для всех пользователей, то, вероятно, лучше сделать новый файл в /etc/profile.d/ , чем для редактирования /etc/profile . Одной из причин этого является то, что при обновлении Ubuntu может появиться новый файл /etc/profile по умолчанию. В зависимости от того, как вы выполняете обновление, будет сохранен старый файл (с вашими изменениями), предшествующий этому обновленному файлу конфигурации, или вам будет предложено обработать ситуацию.

Когда одна и та же переменная среды устанавливается как в /etc/profile , так и в одном или нескольких файлах в /etc/profile.d , который выполняется последним? Это зависит от того, установлены ли команды из /etc/profile появляются до или после того, как файлы в profile.d были получены (по коду, указанному выше). Команды в /etc/profile выполняются в том порядке, в котором они отображаются.

/etc/profile - это сценарий оболочки, а его синтаксис not совпадает с синтаксисом файлов конфигурации PAM, описанных выше .Его синтаксис совпадает с синтаксисом для файла ~/.profile для каждого пользователя (см. Ниже).

Если вам нужно написать код, который решает , добавлять или не добавлять конкретный каталог в PATH (и делать это для всех пользователей), вы не сможете использовать /etc/environment или /etc/security/pam_env.conf , чтобы сделать это. Это, пожалуй, основная ситуация, когда лучше использовать /etc/profile или /etc/profile.d/ .

5. Для одного пользователя: .bash_profile в домашнем каталоге пользователя

Если у пользователя ~/.bash_profile , bash использует его вместо ~/.profile или ~/.bash_login (см. ниже). Обычно вы не должны иметь .bash_profile в своем домашнем каталоге.

Если вы это сделаете, обычно он должен содержать команду для источника ~/.profile (например, . "$HOME/.profile" ). В противном случае содержимое файла .profile для каждого пользователя не запускается вообще.

6. Для одного пользователя: .bash_login в домашнем каталоге пользователя

Если у пользователя есть ~/.bash_login , bash использует его вместо ~/.profile (см. ниже), если только ~/.bash_profile не существует, и в этом случае ни один из остальных не будет использоваться, если только он не найден из ~ ~ .bash_login.

Как и в случае .bash_profile , вы обычно не должны иметь файл .bash_login в своем домашнем каталоге.

7. Для одного пользователя: .profile в домашнем каталоге пользователя.

Когда оболочка стиля Bourne запускается как оболочка входа, она запускает команды в /etc/profile (которая обычно включает команды, которые вызывают команды в файлах в /etc/profile.d/ для запуска - см. выше). После этого он запускает команды в .profile в домашнем каталоге пользователя. Этот файл является отдельным для каждого пользователя. (Bash фактически запускает .bash_profile или .bash_login , если они существуют, но для пользователей в системе Ubuntu эти файлы редко должны существовать или существуют. Подробнее см. Выше и 6.2 Файлы загрузки Bash в руководство Bash .)

~/.profile , таким образом, является основным местом для пользователя, который ставит команды, которые запускаются при входе в систему. Это традиционное место для установки PATH , но поскольку Ubuntu имеет модуль pam_env и поддерживает ~/.pam_environment , вы должны подумать об использовании этого.

Как и в случае /etc/profile , не все диспетчеры отображают этот файл для графического входа в систему, хотя большинство из них делает это. Это причина, по которой предпочитается ~/.pam_environment для установки переменных среды (так как можно предпочесть /etc/environment to /etc/profile ).

Вы можете расширить переменные среды, в том числе PATH , при установке PATH в .pam_environment (см. выше). Однако, если вам нужно установить PATH более сложным способом, вам может потребоваться вместо этого использовать .profile . В частности, если вы хотите проверить, существует ли каталог каждый раз, когда пользователь входит в систему и только добавляет его в PATH , если это так, то вы не сможете использовать файл .pam_environment , чтобы добавить этот каталог в свой PATH .

Например, файл по умолчанию для каждого пользователя .profile на Ubuntu , используемый для , заканчивается на:

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

См. Gunnar Hjalmarsson комментарий в Байт Ответ командира для деталей.

Это проверяет наличие подкаталога bin вашего домашнего каталога. Если это так, добавляет этот подкаталог в начало вашего PATH .

В этом списке отсутствуют некоторые возможности.

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

Я забыл несколько файлов, где люди иногда определяют переменные среды, такие как ~/.bashrc и /etc/bash.bashrc , потому что обычно не рекомендуются места для установки PATH , и редко вы их используете для этой цели. Если вы используете эти файлы для добавления каталогов в PATH , они иногда будут добавляться много раз и очень запутывают, когда вы просматриваете $PATH . (В крайних случаях это может замедлить работу, но обычно это всего лишь вопрос сохранения чистоты и понимания.)

Так как bash - это оболочка входа Ubuntu для пользователей, и большинство пользователей используют ее или какую-либо другую совместимую с POSIX оболочку, я опустил информацию о том, как переменные среды устанавливаются в других оболочках, отличных от типа Bourne, таких как tcsh .     

ответ дан Eliah Kagan 30.12.2016 в 19:30
1

/ etc / environment файл не является файлом сценария, который вы не можете использовать там, и он не поддерживает расширение переменной типа $ HOME, просто пары simplevariable = value. Чтобы использовать этот файл, вам нужно просто добавить свой путь к существующему определению, специально предназначенный для общесистемных параметров среды. по одной в каждой строке. В частности, этот файл хранит общесистемные настройки языка и пути.

~ / .profile . Этот файл запускается всякий раз, когда выполняется оболочка bash, обычно рекомендуется для переменных среды, однако имеет недостаток только в том, что они вызываются только с помощью оболочек входа, поэтому в чтобы он вступил в силу, вам нужно будет выйти из системы и вернуться в нее или, по крайней мере, запустить новую оболочку для входа.

    
ответ дан eGhoul 30.12.2016 в 15:07
1

Предпочтительное место для установки переменных окружения зависит от нескольких вещей:

  1. Вы единственный, кто пользуется компьютером:
    • В этом случае лучшее место для его установки будет в /etc/environment , так как нет угрозы для несанкционированного доступа.
  2. Если система используется многими
    • Если переменные должны быть доступны всем, то местоположение будет /etc/environment , но
    • Если отдельные пользователи должны выбрать для них доступ, то каждый должен установить их в ~/.profile , относящихся к каждому пользователю системы, так как он находится в каждом доме пользователя каталог.

Система прочитает /etc/environment перед чтением ~/.profile . Нет concatenation , и, как Alex P говорит, что превалирует последнее присваивание .

Для более подробного изучения факторов, определяющих, как ~/.profile и /etc/environment разыгрываются в других таких местах, перейдите здесь и здесь , так как эти факторы будут влиять на то, как вы используете эти местоположения.     

ответ дан George Udosen 30.12.2016 в 15:10