У чому різниця між .bashrc
і від .bash_profile
кого я повинен користуватися?
.profile
, перегляньте це питання: superuser.com/questions/789448/…
У чому різниця між .bashrc
і від .bash_profile
кого я повинен користуватися?
.profile
, перегляньте це питання: superuser.com/questions/789448/…
Відповіді:
Традиційно, коли ви входите в систему Unix, система запустила б одну програму для вас. Ця програма є оболонкою, тобто програмою, призначеною для запуску інших програм. Це оболонка командного рядка: ви запускаєте іншу програму, ввівши її ім'я. Оболонка за замовчуванням, оболонка Bourne, читає команди, ~/.profile
коли вона викликається як оболонка для входу.
Баш - оболонка Борна. Він читає команди з того часу, ~/.bash_profile
коли його викликають як оболонку входу, і якщо цього файлу не існує¹, він намагається читати ~/.profile
замість цього.
Ви можете викликати оболонку безпосередньо в будь-який час, наприклад, запустивши емулятор терміналу всередині GUI-середовища. Якщо оболонка не є оболонкою для входу, вона не читається ~/.profile
. Коли ви запускаєте bash як інтерактивну оболонку (тобто не запускати скрипт), вона зчитується ~/.bashrc
(за винятком випадків, коли викликається як оболонка для входу, тоді вона лише читає ~/.bash_profile
або ~/.profile
.
Тому:
~/.profile
це місце, щоб розмістити речі, які стосуються всього вашого сеансу, такі як програми, які ви хочете запустити під час входу (але не графічні програми, вони переходять у інший файл) та визначення змінної середовища.
~/.bashrc
це місце, щоб розмістити речі, які стосуються лише самого bash, наприклад, псевдоніми та функції функцій, параметри оболонки та швидкі налаштування. (Ви також можете покласти там ключові прив'язки, але для гри вони зазвичай входять ~/.inputrc
.)
~/.bash_profile
можна використовувати замість ~/.profile
, але він читається лише bash, а не будь-якою іншою оболонкою. (Це здебільшого викликає занепокоєння, якщо ви хочете, щоб ваші ініціалізаційні файли працювали на декількох машинах, і ваша оболонка для входу не збилася з усіх.) Це логічне місце для включення, ~/.bashrc
якщо оболонка інтерактивна. Я рекомендую наступний вміст у ~/.bash_profile
:
if [ -r ~/.profile ]; then . ~/.profile; fi
case "$-" in *i*) if [ -r ~/.bashrc ]; then . ~/.bashrc; fi;; esac
У сучасних мережах є додаткові ускладнення, пов’язані з ~/.profile
. Якщо ви входите в графічне середовище (тобто якщо програма, в якій ви вводите свій пароль, працює в графічному режимі), ви автоматично не отримаєте оболонку входу, яка зчитує ~/.profile
. Залежно від програми графічного входу, від керування вікнами чи середовища робочого столу, яке ви запускаєте після цього, і від того, як ваш дистрибутив налаштував ці програми, ви ~/.profile
можете чи не може бути прочитаний. Якщо це не так, зазвичай є інше місце, де можна визначити змінні середовища та програми, які потрібно запустити під час входу, але, на жаль, немає стандартного місця.
Зауважте, що ви можете бачити тут і там рекомендації щодо введення визначень змінних середовищ у ~/.bashrc
або завжди запуску оболонок входу в термінали. І те й інше - погані ідеї. Найпоширенішою проблемою будь-якої з цих ідей є те, що ваші змінні середовища встановлюватимуться лише в програмах, запущених через термінал, а не в програмах, запущених безпосередньо з піктограмою чи меню або ярликом клавіатури.
¹ Для повноти за бажанням: якщо .bash_profile
не існує, Баш також намагається , .bash_login
перш ніж впасти назад .profile
. Сміливо забудьте, що існує.
~/.bash_profile
можна використовувати замість ~/.profile
, але також потрібно включити, ~/.bashrc
якщо оболонка інтерактивна. вводить в оману, оскільки це ортогональні питання. Незалежно від того , якщо ви використовуєте ~/.bash_profile
або ~/.profile
ви повинні включити ~/.bashrc
в тій , який ви використовуєте , якщо ви хочете настройки звідти , щоб мати ефект в оболонках.
~/.bashrc
має щось спільне з вибором, ~/.bash_profile
замість ~/.profile
якого не відповідає дійсності. Якщо хтось включає ~/.bashrc
будь-який тип сценарію, який отримується під час входу в систему (тут це або ~/.bash_profile
або ~/.profile
), це тому, що він хоче, щоб установки ~/.bashrc
були застосовані до оболонки входу так само, як вони застосовуються до оболонки без входу.
З цієї короткої статті
Згідно зі сторінкою bash man, .bash_profile виконується для оболонок входу, тоді як .bashrc виконується для інтерактивних оболонок без входу.
Що таке оболонка для входу або не вхід?
Коли ви входите (наприклад: введіть ім'я користувача та пароль) через консоль, або фізично сидіти за машиною під час завантаження, або віддалено через ssh: .bash_profile виконується для налаштування речей перед початковим командним рядком.
Але, якщо ви вже увійшли в свою машину і відкрили нове вікно терміналу (xterm) всередині Gnome або KDE, то .bashrc виконується перед командним вікном вікна. .bashrc також запускається при запуску нового екземпляра bash, ввівши / bin / bash в терміналі.
Ще в старі часи, коли псевдоти не були псевдо, а насправді, добре набрали, а UNIXes були доступні модемами настільки повільно, що ви могли бачити друк кожного листа на екрані, ефективність була першорядною. Щоб дещо підвищити ефективність, у вас була концепція головного вікна входу та будь-яких інших вікон, якими ви працювали. У головному вікні ви хочете отримувати сповіщення про будь-яку нову пошту, можливо, запускати деякі інші програми у фоновому режимі.
Щоб підтримати це, оболонки виділяли файл .profile
спеціально на "оболонках входу". Це зробило б спеціальну установку сеансу. Bash розширив це дещо, щоб подивитися на .bash_profile спочатку перед .profile, таким чином, ви можете помістити туди лише речі (щоб вони не накручували оболонку Борна тощо), які також дивилися на .profile). Інші оболонки, не вхідні в систему, просто будуть джерелом файлу rc, .bashrc (або .kshrc тощо).
Це трохи анахронізм зараз. Ви не входите в основну оболонку стільки, скільки входите в менеджер вікон gui. Немає головного вікна, відмінного від будь-якого іншого вікна.
Моя пропозиція - не турбуйтеся про цю різницю, вона заснована на старому стилі використання unix. Усуньте різницю у ваших файлах. Весь вміст .bash_profile повинен бути:
[ -f $HOME/.bashrc ] && . $HOME/.bashrc
І поставте все, що ви насправді хочете встановити, у .bashrc
Пам'ятайте, що .bashrc розміщений для всіх оболонок, інтерактивних та неінтерактивних. Ви можете коротко замикати джерело пошуку неінтерактивних оболонок, помістивши цей код біля вершини .bashrc:
[[ $- != *i* ]] && return
.$HOME/.bashrc
як показав Річ, вище, налаштування в .bashrc
буде доступна в оболонках для входу, а отже, і на робочому столі. Наприклад, у моїй системі Fedora gnome-session
запускається так -$SHELL -c gnome-session
, .profile
як читається.
.bashrc
в .profile
зазвичай не працює, тому що .profile
може бути виконана /bin/sh
і не Баш (наприклад , на Ubuntu для графічного входу в систему за замовчуванням), і ця оболонка не може бути інтерактивними (наприклад , для графічного входу в систему ).
[[ $- != *i* ]] && return
"); Мені подобається, що деякі з моїх .bashrc
виконуються навіть для неінтерактивних оболонок, спеціально для встановлення env vars при видачі ssh hostname {command}
, щоб віддалені команди виконувались правильно (навіть якщо оболонка не інтерактивна). Але інші налаштування пізніше в програмі .bashrc
слід ігнорувати. Я зазвичай перевіряю наявність TERM = німий та / або скасований, а потім достроково підписую.
Погляньте на цю чудову допис у блозі ShreevatsaR . Ось витяг, але перейдіть до публікації блогу, вона містить пояснення для таких термінів, як "оболонка входу", блок-схема та подібну таблицю для Zsh.
Для Баша вони працюють так. Прочитайте відповідний стовпець. Виконує A, потім B, потім C тощо. B1, B2, B3 означає, що він виконує лише перший із знайдених файлів.
+----------------+-----------+-----------+------+
| |Interactive|Interactive|Script|
| |login |non-login | |
+----------------+-----------+-----------+------+
|/etc/profile | A | | |
+----------------+-----------+-----------+------+
|/etc/bash.bashrc| | A | |
+----------------+-----------+-----------+------+
|~/.bashrc | | B | |
+----------------+-----------+-----------+------+
|~/.bash_profile | B1 | | |
+----------------+-----------+-----------+------+
|~/.bash_login | B2 | | |
+----------------+-----------+-----------+------+
|~/.profile | B3 | | |
+----------------+-----------+-----------+------+
|BASH_ENV | | | A |
+----------------+-----------+-----------+------+
| | | | |
+----------------+-----------+-----------+------+
| | | | |
+----------------+-----------+-----------+------+
|~/.bash_logout | C | | |
+----------------+-----------+-----------+------+
[ -z "$PS1" ] && return
:? У таблиці моєї відповіді наведено список скриптів, керованих Башем, незалежно від вмісту скриптів, якщо у самого сценарію є рядок [ -z "$PS1" ] && return
, звичайно, це вступить у силу, але я не думаю, що це повинно означати, що я повинен змінити стіл.
Кращий коментар для керівника / ETC / ПРОФІЛЬ
Спираючись на чудову відповідь Flimm вище, я вписав цей новий коментар у голову мого Debian / etc / profile (можливо, вам знадобиться налаштувати його на ваш дистрибутив.) :
# For BASH: Read down the appropriate column. Executes A, then B, then C, etc.
# The B1, B2, B3 means it executes only the first of those files found. (A)
# or (B2) means it is normally sourced by (read by and included in) the
# primary file, in this case A or B2.
#
# +---------------------------------+-------+-----+------------+
# | | Interactive | non-Inter. |
# +---------------------------------+-------+-----+------------+
# | | login | non-login |
# +---------------------------------+-------+-----+------------+
# | | | | |
# | ALL USERS: | | | |
# +---------------------------------+-------+-----+------------+
# |BASH_ENV | | | A | not interactive or login
# | | | | |
# +---------------------------------+-------+-----+------------+
# |/etc/profile | A | | | set PATH & PS1, & call following:
# +---------------------------------+-------+-----+------------+
# |/etc/bash.bashrc | (A) | A | | Better PS1 + command-not-found
# +---------------------------------+-------+-----+------------+
# |/etc/profile.d/bash_completion.sh| (A) | | |
# +---------------------------------+-------+-----+------------+
# |/etc/profile.d/vte-2.91.sh | (A) | | | Virt. Terminal Emulator
# |/etc/profile.d/vte.sh | (A) | | |
# +---------------------------------+-------+-----+------------+
# | | | | |
# | A SPECIFIC USER: | | | |
# +---------------------------------+-------+-----+------------+
# |~/.bash_profile (bash only) | B1 | | | (doesn't currently exist)
# +---------------------------------+-------+-----+------------+
# |~/.bash_login (bash only) | B2 | | | (didn't exist) **
# +---------------------------------+-------+-----+------------+
# |~/.profile (all shells) | B3 | | | (doesn't currently exist)
# +---------------------------------+-------+-----+------------+
# |~/.bashrc (bash only) | (B2) | B | | colorizes bash: su=red, other_users=green
# +---------------------------------+-------+-----+------------+
# | | | | |
# +---------------------------------+-------+-----+------------+
# |~/.bash_logout | C | | |
# +---------------------------------+-------+-----+------------+
#
# ** (sources !/.bashrc to colorize login, for when booting into non-gui)
І ця примітка в голові кожного з інших файлів налаштування для посилання на неї:
# TIP: SEE TABLE in /etc/profile of BASH SETUP FILES AND THEIR LOAD SEQUENCE
Варто зазначити, що я думаю, що / etc / профіль Debian за типовими джерелами (включає) /etc/bash.bashrc (саме тоді /etc/bash.bashrc існує). Тож сценарії входу читають обидва файли / etc, тоді як невхідні дані читають лише bash.bashrc.
Також слід зазначити, що /etc/bash.bashrc налаштований нічого не робити, коли він не працює інтерактивно. Тож ці два файли призначені лише для інтерактивних сценаріїв.
Логіка конфігурації bash сама по собі не є надзвичайно складною і пояснюється в інших відповідях на цій сторінці, на сервері за замовчуванням і в багатьох блогах. Однак проблема полягає в тому, що Linux-дистрибутиви складають bash , я маю на увазі складні та різні способи налаштування bash за замовчуванням. http://mywiki.wooledge.org/DotFiles коротко згадує про деякі ці примхи. Ось один зразок сліду на Fedora 29, він показує, які файли джерело, які інші файли (файли) та в якому порядку для дуже простого сценарію: віддалене підключення до ssh, а потім запуск іншої нижньої оболонки:
ssh fedora29
└─ -bash # login shell
├── /etc/profile
| ├─ /etc/profile.d/*.sh
| ├─ /etc/profile.d/sh.local
| └─ /etc/bashrc
├── ~/.bash_profile
| └─ ~/.bashrc
| └─ /etc/bashrc
|
|
└─ $ bash # non-login shell
└─ ~/.bashrc
└─ /etc/bashrc
└─ /etc/profile.d/*.sh
Найскладніша логіка Fedora полягає в /etc/bashrc
. Як видно вище /etc/bashrc
, про файл bash сам не знає, я маю на увазі не безпосередньо. /etc/bashrc
Тести Fedora чи:
... а потім робить абсолютно різні речі залежно від них.
Якщо ви вважаєте, що можете запам'ятати графік вище, то занадто погано, оскільки його майже недостатньо: цей графік описує лише один сценарій, при запуску неінтерактивних сценаріїв або запуску графічного сеансу трапляються дещо інші речі. Я опустив ~/.profile
. Я пропустив bash_completion
сценарії. З міркувань зворотної сумісності виклик bash як /bin/sh
замість /bin/bash
зміни своєї поведінки. А що з zsh та іншими оболонками? І звичайно, різні дистрибутиви Linux роблять все по-різному, наприклад, Debian і Ubuntu поставляються з нестандартною версією bas h, він має специфічні для Debian настройки. Він особливо шукає незвичайний файл:/etc/bash.bashrc
. Навіть якщо ви дотримуєтесь одного дистрибутива Linux, він, ймовірно, розвивається з часом. Зачекайте: ми навіть не торкалися macOS, FreeBSD, ... Нарешті, давайте подумаємо, що для користувачів дотримуються ще більш креативні способи, яким їх адміністратори налаштували систему, яку вони повинні використовувати.
Як демонструє нескінченний потік дискусій на цю тему, це втрачена причина. Поки ви просто хочете додати нові значення, деяких "проб і помилок", як правило, достатньо. Справжня забава починається, коли ви хочете змінити в одному (користувальницькому) файлі щось, що вже визначено в іншому (в / і т.д.). Тоді будьте готові витратити деякий час на розробку рішення, яке ніколи не буде портативним.
Для останнього задоволення ось "графік джерела" для того ж простого сценарію Clear Linux станом на червень 2019 року:
ssh clearlinux
└─ -bash # login shell
├── /usr/share/defaults/etc/profile
| ├─ /usr/share/defaults/etc/profile.d/*
| ├─ /etc/profile.d/*
| └─ /etc/profile
├── ~/.bash_profile
|
|
└─ $ bash # non-login shell
├─ /usr/share/defaults/etc/bash.bashrc
| ├─ /usr/share/defaults/etc/profile
| | ├─ /usr/share/defaults/etc/profile.d/*
| | ├─ /etc/profile.d/*
| | └─ /etc/profile
| └─ /etc/profile
└─ ~/.bashrc