Де найкраще місце для встановлення PATH
envvar?
~/.profile
або /etc/environment
?
Що відбувається у випадку PATH
встановлення в обох місцях? Чи є кінцевим результатом об'єднання обох значень у цих двох місцях?
Де найкраще місце для встановлення PATH
envvar?
~/.profile
або /etc/environment
?
Що відбувається у випадку PATH
встановлення в обох місцях? Чи є кінцевим результатом об'єднання обох значень у цих двох місцях?
Відповіді:
Підсумок:
Якщо ви хочете додати шлях (наприклад /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
мали ефект для вашого користувача.
Повне розуміння змінних довкілля див .: https://help.ubuntu.com/community/EnvironmentVariables
Пов'язане запитання: різниця між файлом bash.bashrc та / etc / середовищем
~/.profile
не перевіряється на наявність ~/bin
, але у нього просто є лінія:PATH="$HOME/bin:$HOME/.local/bin:$PATH"
/etc/skel/.profile
в 16.04 є рядок, який я згадав. Ви, мабуть, створили свого користувача в попередньому випуску.
~/.profile
все ще є це, але ви маєте рацію - /etc/skel/.profile
немає його в моїй оновленій системі 16.04 (і обліковий запис користувача, створений при встановленні 16.04 інша машина не має їх у своїх .profile
).
Ця відповідь головним чином стосується порядку, в якому змінні середовища, подібні
PATH
до призначення, призначаються в різних файлах конфігурації. Я також висвітлюю те місце, де ви зазвичай їх встановлюєте, але список, наведений нижче, не перераховує файли в тому порядку, який слід розглянути. Для отримання загальної інформації про налаштуванняPATH
та інші змінні середовища в Ubuntu, я також рекомендую прочитати EnvironmentVariables та інші відповіді на це питання.
Бажане місце для встановлення PATH
залежить від того, для кого потрібно встановити його, коли і як ви хочете його встановити. Частиною вашого рішення буде те, чи потрібно встановити змінну середовища для всіх користувачів або на основі кожного користувача. Якщо ви не впевнені, рекомендую налаштувати його лише для одного користувача (наприклад, свого облікового запису), а не для загального користування.
Як каже AlexP , PATH
змінна середовища матиме значення, яке воно було нещодавно призначено . На практиці більшу частину встановленого часу ви PATH
включаєте старе значення PATH
у нове значення, щоб попередні записи зберігалися.
Таким чином, на практиці, коли PATH
встановлено з декількох файлів, він зазвичай містить записи, задані у всіх файлах. Але це відбувається лише тому, що всі файли, які його встановили, крім першого, зазвичай посилаються на PATH
саму змінну, внаслідок чого її старе значення включається в нове.
Таким чином, ви фактично просите про порядок введення PATH
параметрів у різних файлах.
Загальні місця загального призначення, які потрібно встановити PATH
, перераховані нижче в тому порядку, в якому вони набувають чинності під час входу користувача, а не в порядку, який ви, як правило, повинні використовувати . Кожне з перелічених нижче місць є розумним вибором для встановлення PATH
в деяких ситуаціях , але лише деякі з них є хорошим вибором більшість часу.
У нижченаведеному списку ви побачите такі назви каталогів, як ~/.profile
. Якщо ви не знайомі з розширенням tilde , ~/
зверніться до домашнього каталогу поточного користувача. Я в основному використовую цей синтаксис для компактності. Він підтримується в скриптах оболонки, але не у файлах конфігурації PAM.
/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"
Якщо вам потрібно встановити змінні середовища для всіх облікових записів користувачів, а не лише для своїх облікових записів користувачів, то змінити цей файл, ймовірно, найкращий вибір. Я рекомендую спершу створити резервну копію. Один із способів створити резервну копію цього файлу:
sudo cp /etc/environment /etc/environment.orig
.orig
Розширення спеціально не потрібно - ви можете відчувати себе добре про іменування резервного копіювання нічого файл , який не збиває з пантелику або вже використовується. (Крім того .orig
, .old
, .backup
і .bak
є загальними.)
Ви можете редагувати цей файл в будь-якому із способів , ви можете редагувати будь-який інший файл в якості кореневого користувача ( sudoedit /etc/enviromnment
, sudo nano -w /etc/environment
, gksudo gedit /etc/environment
і т.д.)
/etc/environment
не підтримує автоматичне включення старого значення змінної. Але це, як правило, непотрібно, оскільки більшу частину часу ви, редагуючи /etc/environment
, встановлювали змінну середовища для всіх користувачів , ви хочете, щоб це було його початкове значення, коли користувач увійшов, все-таки. Потім користувач може змінити його як завгодно. Зазвичай для користувачів це добре робити.
/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
і ви повинні бути дуже обережними, якщо це зробите , оскільки неправильно сформована лінія звичайно не дасть усім нормальним обліковим записам користувачів увійти в систему! Наприклад, за замовчуванням 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
Не робіть цього!
Я просто перевірив це випадково, і це завадило будь-яким користувачам успішно входити в систему. Щоб виправити це, мені довелося завантажитися у режимі відновлення та змінити його назад. (На щастя, я це робив на віртуальній машині, яку використовую лише для тестування речей, тому це не викликало у мене ніяких проблем.)
.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
для отримання додаткової інформації.
Хоча колись це вважалося кращим способом для користувачів Ubuntu змінювати або додавати змінні середовища і все ще вважається розумним і прийнятним вибором, слід бути обережним під час редагування.pam_environment
. Як і внесення змін до загальносистемної системи /etc/security/pam_env.conf
(див. Вище), неправильно сформована лінія у .pam_environment
файлі користувача запобігає успішному входу в систему. (Я відчув це. - навмисне на цей раз) Для отримання інформації про те , як ці рекомендації були еволюціонували см Гуннар Hjalmarsson «s коментарі нижче і це ubuntu-devel
обговорення .
Така помилка, як правило , набагато менш серйозна, ніж неправильно сформована лінія pam_env.conf
, оскільки стосується лише одного користувача. Однак у випадку настільної системи Ubuntu з лише одним обліковим записом користувача, який дозволяє .pam_environment
входити в систему , така помилка під час редагування буде такою ж поганою, як і помилка редагування pam_env.conf
- якщо ви ще не ввійшли в систему, ви не зможете виправити його без завантаження у режимі відновлення (або з живого USB тощо).
(Якщо у вас є інші облікові записи користувачів, ви можете увійти як інший користувач і виправити проблему. Навіть якщо вони не є адміністратором і не можуть sudo
отримати корінь, вони все одно можуть запускатись і запропонувати ввести ваш (не їх) пароль . Однак обліковий запис гостя не може цього зробити, оскільки забороняється використовувати особисті дані для іншого користувача.)su your-account
su
/etc/profile
і файли всередині/etc/profile.d/
Оболонки, сумісні з Bourne (включаючи bash
оболонку користувача за замовчуванням в Ubuntu), виконують команди, /etc/profile
коли викликаються як оболонка для входу.
/etc/profile.d
Закінчується Ubuntu :
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
є скриптом оболонки, і його синтаксис не такий, як у файлах конфігурації PAM, обговорених вище . Його синтаксис такий самий, як синтаксис ~/.profile
файлу для користувача (див. Нижче).
Якщо вам потрібно написати код, який вирішує, додавати чи ні до певного каталогу PATH
(і робити це для всіх користувачів), ви не зможете використовувати /etc/environment
або /etc/security/pam_env.conf
робити це. Це, мабуть, головна ситуація, коли краще використовувати /etc/profile
або /etc/profile.d/
замість цього.
.bash_profile
у домашньому довіднику користувачаЯкщо у користувача є ~/.bash_profile
, bash використовує його замість ~/.profile
або ~/.bash_login
(див. Нижче). Зазвичай .bash_profile
у домашньому довіднику не має бути.
Якщо це так, зазвичай, він повинен містити команду для джерела ~/.profile
(наприклад, . "$HOME/.profile"
). В іншому випадку вміст .profile
файлу для користувача зовсім не запускається.
.bash_login
у домашньому довіднику користувачаЯкщо у користувача є ~/.bash_login
, bash використовує його замість ~/.profile
(див. Нижче), якщо не ~/.bash_profile
існує, в такому випадку жоден з інших не буде використовуватися, якщо не отримано з `~ / .bash_login.
Як і у випадку .bash_profile
, зазвичай .bash_login
у вашому домашньому каталозі файл не має бути .
.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
щоб /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
Див Гуннар Hjalmarsson «s коментар на відповідь Byte командора для деталей.
Це перевіряє, чи є у вас bin
підкаталог домашнього каталогу. Якщо це так, він додає цей підкаталог на початок вашого PATH
.
Існують й інші способи, коли змінні середовища встановлюються, коли користувачі входять, що сильніше залежать від типу входу. Наприклад, ви можете іноді мати змінні середовища, які встановлюються лише для графічних входів або просто для віддалених входів на основі SSH. Перелік, наведений вище, не охоплює таких випадків.
Я залишив декілька файлів, де люди іноді визначають змінні середовища, як-от ~/.bashrc
і /etc/bash.bashrc
тому, що вони, як правило, не рекомендовані для встановлення місця, PATH
і рідко ви дійсно використовуєте їх для цієї мети. Якщо ви використовуєте ці файли для додавання каталогів PATH
, вони іноді додаватимуться багато разів і дуже заплутані при вивченні $PATH
. (В крайньому випадку це може уповільнити ситуацію, але зазвичай це лише питання збереження чистого та зрозумілого.)
Оскільки bash
оболонка входу за замовчуванням Ubuntu для користувачів, і більшість користувачів використовує її або якусь іншу сумісну з POSIX оболонку, я опустив інформацію про те, як встановлюються змінні середовища в інших оболонках, не-Bourne-стилі, таких як tcsh
.
/etc/environment
/ , ~/.pam_environment
як в рекомендованих файлах. Після консультацій з розробниками я змінив його на нейтральний стан між PAM та /etc/profile.d/*.sh
/ ~/.profile
, і я все ще схильний дивитися на це таким чином.
/etc/profile.d/*.sh
/ ~/.profile
є те, що синтаксис простіший і що lightdm / gdm прощають у разі помилок (навіть помилки синтаксису не заважають вам увійти, а просто призводять до попереджувальних повідомлень).
pam_env.so
, ви мали на увазі pam_env.conf
?
pam_env.conf
. Дякую! Я відредагував, щоб виправити це.
/ etc / environment file не є файлом скрипту, ви не можете використовувати експорт туди, він не підтримує змінне розширення типу $ HOME, просто simplevariable = значення пар. Отже, щоб використовувати цей файл, вам потрібно буде просто додати свій шлях до існуючого визначення, спеціально призначеного для загальносистемних змінних параметрів середовища. по одному на рядок. Зокрема, цей файл зберігає загальносистемні параметри та параметри шляху.
~ / .profile - Цей файл виконується кожного разу, коли виконується bash оболонка, як правило, рекомендована для змінних оточення, однак у неї є недолік, коли вона викликається оболонками входу, тому для того, щоб вона набула чинності, вам знадобиться щоб вийти з системи та знову увійти - або, принаймні, розпочати нову оболонку входу.
Краще місце для встановлення змінних довкілля залежить від кількох речей:
/etc/environment
оскільки немає небезпеки доступу до авторизованого доступу./etc/environment
, але~/.profile
що стосується кожного користувача системи, оскільки він розташований у домашньому каталозі кожного користувача.Система буде читати /etc/environment
перед читанням ~/.profile
. Не відбувається конкатенації, і, як сказав Алекс П, останнє призначення шляху переважає.
Для більш детального ознайомлення з факторами, які визначають, як ~/.profile
і як /etc/environment
грати з іншими такими локаціями, переходьте сюди і сюди , оскільки ці фактори впливатимуть на те, як ви використовуєте ці місця.