Повне уявлення про те, де встановлена ​​змінна PATH в bash


17

Я прочитав у декількох місцях, що PATHвстановлений файл /etc/profileабо .profileфайл, який знаходиться в домашньому режимі.

Це єдині місця, до яких встановлений шлях? Я хочу краще зрозуміти це.

У /etc/profileфайлі, як говорить наступний коментар "system-wide .profile file for the Bourne shell". Чи означає це, що головні файли конфігурації для bash?

У цьому файлі я взагалі не бачу встановлення PATHvar. У .profileфайлі в домашньому каталозі є такий рядок:

PATH="$HOME/bin:$PATH"

Це скидає PATHвигляд, тому що це об'єднує вже встановлений $PATHрядок з $HOME/bin:правильним? Але якщо etc/profileі ~/.profileє єдине налаштування файлів, PATHзвідки $PATHнадходить у цьому рядку коду, якщо він не визначений у /etc/profile?

Чи може хтось досвідчений, будь ласка, дати широке та детальне пояснення PATHзмінної? Спасибі!

Відповіді:


20

Є багато місць, де PATHїх можна встановити.

loginПрограма встановлює його значення за замовчуванням. Налаштування цього значення за замовчуванням залежить від системи. У більшості невбудованих систем Linux він береться /etc/login.defsз різними значеннями для root та для інших користувачів. Зверніться до login(1)посібника на вашій системі, щоб дізнатися, що це робить.

У системах, що використовують PAM , зокрема pam_envмодуль, змінні середовища можуть бути встановлені у загальносистемному файлі /etc/environmentта у файлі користувача ~/.pam_environment.

Тоді більшість способів увійти в систему (але не завдання Cron) виконують оболонку входу, яка зчитує файли конфігурації для всієї системи та користувачів. Ці файли можуть змінювати значення PATH, як правило, для додавання записів, але іноді іншими способами. Які файли читаються, залежить від того, що таке оболонка для входу. Оболонки в стилі Bourne / POSIX читають /etc/profileі ~/.profile. Bash читає /etc/profile, але для файлу для кожного користувача він зчитує лише перший існуючий файл серед ~/.bash_profile, ~/.bash_loginі ~/.profile. Zsh читає /etc/zshenv, ~/.zshenv, /etc/zprofile, ~/.zprofile, /etc/zloginі ~/.zlogin. Багато сесій GUI організувати для завантаження /etc/profileі ~/.profile, але це залежить від менеджера дисплея, на робочому столі середовища або інший сценарій ініціації сесії, і як кожне розподіл має їх налаштування.


4

Початкова змінна PATH зазвичай встановлюється в /etc/profile Іноді адміністратор sys також додає змінні PATH до джерела/etc/profile.d

Це системи PATH vars, які кожен, хто входить у систему, успадковує за замовчуванням (за винятком випадків, коли локально переобладнано). Зазвичай це встановлює очевидні шляхи, як-от /usr/bin, хоча в моїй роботі ми /optшироко використовуємо і кілька нестандартних місць, тому вони також встановлені.

На основі акаунтів для входу на користувача, PATH також може бути визначений у ~/.profile. Це може визначати речі, до яких не всі користувачі мають доступ; можливо, керівники відділів можуть запускати бінарні файли, /optале інші користувачі не переймаються цими бінарними файлами. Користувачі можуть і сам змінювати цей файл, і приємно в тому .profile, що він не є специфічним для оболонки; Якщо ви ввійдете в систему, набір PATH там з’являється.

Для оболонки конкретних імен входу, шлях може бути визначений в ~/.bash_profile, ~/.bashrcабо .cshrc, або аналогічний. Користувачі можуть встановити тут PATH, якщо вони хочуть конкретних шляхів для конкретних оболонок або якщо вони просто підтримують там всі свої особисті переваги.

Підсумовуючи: / etc / profile та /etc/profile.d - це традиційно каскадні налаштування; вони передаються у спадок і зазвичай додаються до особистих точкових файлів (хоча користувач може замість них замінити). Особисті файли точок зазвичай встановлюються користувачем.

Звичайно, в оболонці є також змінні середовища, тому локальна змінна середовище також може додавати або змінювати стандартний PATH у будь-якому з файлів конфігурації.


Я щойно перевірив усі ті згадані вами файли, ~ / .bash_profile та .cshrc, однак, не існує. 3 файли сценаріїв у /etc/profile.d dir: appmenu-qt5.sh, bash_completion.sh & vte.sh також не встановлюють змінну PATH. Що ви маєте на увазі під "оболонкою також є змінні середовища", чи встановлено PATH за замовчуванням у програмі binary / bin / bash? Коли я закінчую echo $ PATH, я отримую: / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin: / usr / games: / usr / local / games але я не маю уявлення, де все це встановлюється насправді.
Ларрі Лоулесс

Я думаю, що я дещо неправильно прочитав ваше запитання, я подумав, що ви запитуєте про всі місця PATH, які можна встановити, але я думаю, що вас більше цікавить, де спочатку встановлено PATH . Для цього подивіться /etc/bashrc. Це визначає спосіб запуску BASH, який повинен включати всі початкові змінні середовища. У моїй системі /etc/bashrcчитається з, /etc/profile.dале це здається, що у вас є лише 3 файли, /etc/profile.dтому ваш дистрибутив може робити це інакше.
Клаату фон Шлакер

1
Я, в основному, хочу знати, що це стосується. Я б хотів, щоб Кен Томпсон був моїм батьком :)
Ларрі Лоулесс

Ви туди потрапите. Повірте, після того, як ви користуєтесь цими матеріалами щодня деякий час, все починає занурюватися, і поки ви продовжуєте запитувати "чому?" і читаючи документи для відповідей, ви зрештою багато чого навчитесь!
Клаату фон Шлакер

У Linux Mint 18 Cinnamon не забудьте перевірити /etc/profile.d/jdk_home.sh, я перейменував цей файл на jdk_home.sh.old, і тепер мій шлях не перекривається, і я можу викликати java -version і бачити Java 9 як очікуваний. Незважаючи на те, що я правильно вибрав Java 9 в оновленнях-aternatives --config java, цей файл jdk_home.sh продовжував переосмислювати $ PATH
flyingdrifter

3

Щоб додати до інших відповідей:

bashвстановить PATHтвердо кодоване значення за замовчуванням, якщо воно не встановлено в середовищі. На машині Ubuntu Server 16.04.2 я отримую:

$ env -i bash -c 'echo $PATH'
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.

Ми можемо перевірити, чи справді це значення жорстко закодовано, а не читається з оточення чи якогось файлу, використовуючи stringsутиліту:

$ strings /bin/bash | grep /usr/sbin
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.

Однак я отримую інший результат на своїй машині Arch Linux:

$ env -i bash -c 'echo $PATH'
/usr/local/sbin:/usr/local/bin:/usr/bin

Отже, схоже, цей параметр за замовчуванням вибирається під час bashпобудови бінарного файлу, що залежить від ОС / розповсюдження, що використовується.


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