Встановлення змінної PATH в / etc / environment vs .profile


58

Де найкраще місце для встановлення PATHenvvar?

~/.profileабо /etc/environment?

Що відбувається у випадку PATHвстановлення в обох місцях? Чи є кінцевим результатом об'єднання обох значень у цих двох місцях?


Останнє призначення PATH, звичайно, переважає. Більшість сценаріїв встановлюють це явно на початку сценарію.
AlexP

Відповіді:


70

Підсумок:

  • Якщо ви хочете додати шлях (наприклад /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 / середовищем


2
На сьогоднішній день ~/.profileне перевіряється на наявність ~/bin, але у нього просто є лінія:PATH="$HOME/bin:$HOME/.local/bin:$PATH"
Гуннар Хджальмарсон

1
@GunnarHjalmarsson Визначте "сьогодні", будь ласка? Я бігаю 16.04 і ось як це виглядає там.
Байт-командир

2
/etc/skel/.profileв 16.04 є рядок, який я згадав. Ви, мабуть, створили свого користувача в попередньому випуску.
Gunnar Hjalmarsson

1
@GunnarHjalmarsson Дякую за інформацію - ще приблизно п’ять хвилин тому я вважав, що за замовчуванням ~/.profileвсе ще є це, але ви маєте рацію - /etc/skel/.profileнемає його в моїй оновленій системі 16.04 (і обліковий запис користувача, створений при встановленні 16.04 інша машина не має їх у своїх .profile).
Елія Каган

2
"... виконується як звичайний скрипт оболонки усіма оболонками під час їх ініціалізації." Я думаю, що це вводить в оману. Можна підказати (для деяких), що просто відкрити термінальну оболонку не входу з робочого столу GUI виконає / etc / profile, який не буде. askubuntu.com/questions/155865/…
Hawkeye Parker

22

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

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

Як каже AlexP , PATHзмінна середовища матиме значення, яке воно було нещодавно призначено . На практиці більшу частину встановленого часу ви PATHвключаєте старе значення PATHу нове значення, щоб попередні записи зберігалися.

Таким чином, на практиці, коли PATHвстановлено з декількох файлів, він зазвичай містить записи, задані у всіх файлах. Але це відбувається лише тому, що всі файли, які його встановили, крім першого, зазвичай посилаються на PATHсаму змінну, внаслідок чого її старе значення включається в нове.

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

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

У нижченаведеному списку ви побачите такі назви каталогів, як ~/.profile. Якщо ви не знайомі з розширенням tilde , ~/зверніться до домашнього каталогу поточного користувача. Я в основному використовую цей синтаксис для компактності. Він підтримується в скриптах оболонки, але не у файлах конфігурації 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"

Якщо вам потрібно встановити змінні середовища для всіх облікових записів користувачів, а не лише для своїх облікових записів користувачів, то змінити цей файл, ймовірно, найкращий вибір. Я рекомендую спершу створити резервну копію. Один із способів створити резервну копію цього файлу:

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, встановлювали змінну середовища для всіх користувачів , ви хочете, щоб це було його початкове значення, коли користувач увійшов, все-таки. Потім користувач може змінити його як завгодно. Зазвичай для користувачів це добре робити.

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і ви повинні бути дуже обережними, якщо це зробите , оскільки неправильно сформована лінія звичайно не дасть усім нормальним обліковим записам користувачів увійти в систему! Наприклад, за замовчуванням 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для отримання додаткової інформації.

Хоча колись це вважалося кращим способом для користувачів 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-accountsu

4. Для всіх користувачів: /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/замість цього.

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щоб /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.


1
[коментар # 1 з 2] Дякую за цей обширний опис! (Я зробив незначну редакцію.) Однак я маю сумніви щодо рекомендованих способів. Кілька років тому EnvironmentVariables згадано /etc/environment/ , ~/.pam_environmentяк в рекомендованих файлах. Після консультацій з розробниками я змінив його на нейтральний стан між PAM та /etc/profile.d/*.sh/ ~/.profile, і я все ще схильний дивитися на це таким чином.
Gunnar Hjalmarsson

1
[коментар # 2 з 2] Ви згадали пару аргументів на користь PAM. Важливими аргументами на користь /etc/profile.d/*.sh/ ~/.profileє те, що синтаксис простіший і що lightdm / gdm прощають у разі помилок (навіть помилки синтаксису не заважають вам увійти, а просто призводять до попереджувальних повідомлень).
Гуннар Хяльмарссон

Коли ви говорили pam_env.so, ви мали на увазі pam_env.conf?
Йохан Буле

@ JohanBoulé Так, я мав на увазі pam_env.conf. Дякую! Я відредагував, щоб виправити це.
Елія Каган

3

/ etc / environment file не є файлом скрипту, ви не можете використовувати експорт туди, він не підтримує змінне розширення типу $ HOME, просто simplevariable = значення пар. Отже, щоб використовувати цей файл, вам потрібно буде просто додати свій шлях до існуючого визначення, спеціально призначеного для загальносистемних змінних параметрів середовища. по одному на рядок. Зокрема, цей файл зберігає загальносистемні параметри та параметри шляху.

~ / .profile - Цей файл виконується кожного разу, коли виконується bash оболонка, як правило, рекомендована для змінних оточення, однак у неї є недолік, коли вона викликається оболонками входу, тому для того, щоб вона набула чинності, вам знадобиться щоб вийти з системи та знову увійти - або, принаймні, розпочати нову оболонку входу.


1

Краще місце для встановлення змінних довкілля залежить від кількох речей:

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

Система буде читати /etc/environmentперед читанням ~/.profile. Не відбувається конкатенації, і, як сказав Алекс П, останнє призначення шляху переважає.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.