Вибір між .bashrc, .profile, .bash_profile тощо [дублікат]


197

На це питання вже є відповідь тут:

Це незручно, але після багатьох років використання POSIX систем Повного часу, я до сих пір важко зрозуміти, якщо оболонка настройка повинна йти .bashrc, .profileабо де - небудь ще. Не кажучи вже про деякі конфігураційні файли, характерні для ОС, як-от .pam_environment.

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


6
це запитання не повинно бути позначене як дублікат, тому причина .profile недоступний у доданому запитанні.
Премрай

Відповіді:


222

TL; DR:

  • ~/.bash_profileмає бути суперпростим і просто завантажувати .profileі .bashrc(у такому порядку)

  • ~/.profileмає речі, НЕ конкретно пов'язані з bash, такі як змінні середовища ( PATHта друзі)

  • ~/.bashrcу інтерактивному командному рядку є все, що ви хочете. EDITORПрямі псевдоніми командного рядка, змінні, bash для мого використання

Кілька інших приміток:

  • shОБОВ'ЯЗКОВО мати все, що має бути доступним для графічних програм АБО для sh (або bash з посиланням на )~/.profile

  • ~/.bashrc не повинен нічого виводити

  • Все, що повинно бути доступним лише для оболонки для входу, має зайти ~/.profile

  • Переконайтесь, що ~/.bash_loginне існує.


3
+1, це дозволяє ~/.profileправильно встановити середовище для таких служб, як GDM / LightDM / LXDM, які явно виконують / bin / sh.
grawity

12
Мої .bashrcрезультати досить багато, ви можете це прокоментувати? Зокрема, куди слід покласти привітання?
Калімо

14
@Calimo: Зробіть лише вихідний матеріал в інтерактивному режимі. Ви можете перевірити його за допомогою [[ $- == *i* ]], тобто шукаючи 'я' у спеціальній $-змінній. Звичайно, це важливо лише в першу чергу в системах, де складено bash для читання .bashrcв неінтерактивному режимі. (Тобто, Debian , але не Arch.) Але це часта причина загадкових повідомлень про помилки при спробі підключення з використанням sftpабо scpсхожими інструментами.
grawity

4
Тепер я повинен знати, чому не повинно існувати .bash_login? Що це робить?
tedder42

11
@ tedder42: Це робить те саме, що .bash_profileі .profile. Але Баш читає лише перший із трьох. Значить, якщо у вас є .bash_login, то і те, .profileі .bash_profileзагадково буде проігноровано.
grawity

54

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

Вимоги:

  • ~/.profile має бути сумісним з будь-яким / bin / sh - це включає bash, dash, ksh і все, що дистрибутив може вибрати.

  • Змінні середовища повинні бути поміщені у файл, який зчитується як консольними входами (тобто оболонками "входу"), так і графічними логінами (тобто менеджерами дисплеїв, такими як GDM, LightDM або LXDM).

  • Існує дуже мало сенсу мати і те, ~/.profile і інше~/.bash_profile . Якщо останній відсутній, bash із задоволенням використовуватиме перший, а будь-які лінії, характерні для bash, можуть бути захищені чеком на $BASHабо $BASH_VERSION.

  • Розмежування між *profileі *rcполягає в тому, що перший використовується для "входу" в оболонки, а останній кожного разу, коли ви відкриваєте вікно терміналу. Однак, bash у режимі "login" не є джерелом ~/.bashrc, тому ~/.profileпотрібно робити це вручну.

Найпростіші конфігурації буде виглядати так :

  • Майте a, ~/.profileщо встановлює всі змінні середовища (крім специфічних для bash), можливо, друкує рядок або дві, а потім джерела, ~/.bashrcякщо вони виконуються bash, інакше дотримуючись sh-сумісний синтаксис.

    export TZ = "Європа / Париж"
    export EDITOR = "vim"
    if ["$ BASH"]; тоді
        . ~ / .bashrc
    фі
    тривалість роботи
    
  • Майте, ~/.bashrcщо виконує будь-які налаштування, характерні для оболонки, захищаються за допомогою перевірки на інтерактивний режим, щоб уникнути злому речей, як sftpна Debian (де bash компілюється з можливістю завантаження ~/.bashrcнавіть для неінтерактивних оболонок):

    [[$ - == * i *]] || повернути 0
    
    PS1 = '\ h \ w \ $'
    
    start () {послуга sudo "$ 1" старт; }
    

Однак існує також проблема того, що деякі неінтерактивні команди (наприклад ssh <host> ls) пропускають ~/.profile, але змінні середовища були б їм дуже корисні.

  • Окремі дистрибутиви (наприклад, Debian) складають їх bash з можливістю джерела ~/.bashrcдля таких неінтерактивних входів. У цьому випадку я вважаю корисним перемістити всі змінні середовища ( export ...рядки) в окремий файл ~/.environта вивести його з обох .profile та .bashrc, захисником, щоб уникнути цього двічі:

    якщо! ["$ PREFIX"]; потім    # або $ EDITOR, або $ TZ, або ... 
        . ~ / .environ            # загалом будь-яка змінна, яку встановив би сам .environ
    фі
    
  • На жаль, для інших дистрибутивів (наприклад, Arch) я не знайшов дуже хорошого рішення. Однією з можливостей є використання (включеного за замовчуванням) PAM-модуля pam_env, ввівши наступне ~/.pam_environment:

    BASH_ENV =. /. Environment         # не друкарська помилка; це повинен бути шлях, але ~ не буде працювати
    

    Потім, звичайно, оновлення ~/.environдо unset BASH_ENV.


Висновок? Раковини - це біль. Змінні середовища - це біль. Варіанти компіляції, що стосуються розповсюдження, - це величезний біль у дупі.


2
+1 за останній пункт, але я віддаю перевагу джерел .profileі .bashrcвід .bash_profileі тримати в .profileчистоті.
nyuszika7h

@ nyuszika7h: Моє .profile чисто , дякую.
grawity

1
Зауважте, що коментар повторюється кожного разу, коли ви відкриваєте вікно - навпаки для OSX
Марк

1
"Є дуже мало сенсу мати обоє ~/.profileі ~/.bash_profile": Я не погоджуюсь. Дивіться відповідь Дена, чому.
rubenvb

@rubenvb Чи можете ви процитувати відповідну частину? Я вважаю, що добре мати лише умовні частини .profileта охороняти їх bashумовними умовами.
Келвін

36

Погляньте на цю чудову допис у блозі 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      |           |      |
+----------------+-----------+-----------+------+

Це добре. Важливо зазначити, що зазвичай /etc/profileдзвінки /etc/bash.bashrcі ~/.profileдзвінки ~.bashrc. Настільки ефективно, /etc/bash.bashrcі ~/.bashrcвони виконуються також для Інтерактивних Логінів.
Вісбукі

Зауважте, що деякі розповсюдження, схоже, перекривають цю схему (із дивними наслідками) - див., Наприклад, мій bugreport, щоб відкритикористування тут: bugzilla.opensuse.org/show_bug.cgi?id=1078124
Крістіан Херенц

Btw. принаймні з bash жоден із цих файлів не виконується, коли виклик bash через/bin/sh
JepZ

@JepZ Ви маєте рацію, саме так пояснюється третя колонка "Сценарій".
Flimm

1
@Flimm Ну, стовпець "Сценарій" описує, що відбувається, коли ви запускаєте неінтерактивний скрипт через bash (наприклад, / bin / bash). Однак якщо ви запускаєте скрипт через sh (і / bin / sh є символьним посиланням на / bin / bash), нічого з вищезазначеного не виконується (навіть не BASH_ENV). Зв'язаний абзац сторінки bash man можна знайти за допомогою пошуку If bash is invoked with the name sh.
JepZ

21

Я пропоную вам свої "вичерпні" рекомендації:

  • Зробіть .bash_profileі .profileзавантажте, .bashrcякщо він існує, використовуючи напр [ -r $HOME/.bashrc ] && source $HOME/.bashrc
  • Покладіть все інше .bashrc.
  • Перестаньте хвилюватися.
  • Кожні чотири роки або близько цього витрачайте десять хвилин на дослідження цього самого питання, перш ніж відмовитися і повернутися до "не турбуватися".

EDIT: Додано цитати відлякувань до "всебічного" лише на випадок, коли хтось захопить повірити в це. ;)


3
Маючи і те, .bash_profileі інше .profile- це зайве; вам потрібно лише останнє. Однак вам потрібно зробити це / bin / sh-proof: if [ "$BASH" ] && [ -r ~/.bashrc ]; then . ~/.bashrc; fiоскільки існують програми (а саме gdm / lightdm), які вручну подають файл із сценарію / bin / sh. Це також означає, що збережене середовище .bashrcбуло б малоефективним. Довелося до -1, оскільки ваші "всебічні" вказівки не працюватимуть у багатьох системах, як я кілька разів виявив важкий шлях.
grawity

Немає жодних проблем, я б із задоволенням заплатив -1 за відповідь, яка не є просто "вичерпною", і ви, безумовно, заслужили цю назву.
Механічна риба

0

Я відмовився від спроби розібратися у цьому, і створив один сценарій ( ~/.shell-setup), який я джерелом з усіх інших.

Цей підхід ~/.shell-setupповинен мати дві особливості:

  1. Запускати лише один раз, навіть коли їх отримують кілька разів (використовуйте Включити охорону )
  2. Не створюйте жодного небажаного результату (виявляйте, коли вихід нормальний)

№1 є досить стандартним, хоча, можливо, не використовується в скриптах оболонок.

№2 складніше. Ось що я використовую в bash:

if [ "" == "$BASH_EXECUTION_STRING" -a "" == "$DESKTOP_SESSION" ]; then
    echo "Hello user!" # ... etc
fi

На жаль, я не пам'ятаю, як я придумав це, або чому виявлення інтерактивної оболонки було недостатньо.


-2

Покладіть усе, .bashrcа потім джерело .bashrcз.profile

З сторінки bash man (на ОС X 10.9):

Коли запускається інтерактивна оболонка, яка не є оболонкою для входу, bash зчитує та виконує команди з ~ / .bashrc, якщо цей файл існує. Це може бути пригнічено за допомогою параметра --norc. Параметр файлу --rcfile змусить bash читати та виконувати команди з файлу замість ~ / .bashrc

Вищенаведений текст - чому все вкладається .bashrc. Однак, ти маєш дещо іншу поведінку, коли ти маєш справу з оболонкою для входу. Знову цитуючи зі сторінки man:

Коли bash викликається як інтерактивна оболонка входу, або як неінтерактивна оболонка з опцією --login, вона спочатку зчитує та виконує команди з файлу / etc / profile, якщо такий файл існує. Прочитавши цей файл, він шукає у такому порядку ~ / .bash_profile, ~ / .bash_login та ~ / .profile та зчитує та виконує команди з першого, який існує та читається. Параметр --noprofile може використовуватися, коли оболонка запускається для пригнічення такої поведінки.

.profileчитається для оболонок для входу, але .bashrcце не так. Дублювання всього цього в матеріалі .bashrcпогано ™, тому нам потрібно його джерело, .profileщоб поведінка залишалася послідовною.

Тим НЕ менше, ви не хочете , щоб джерело .bashrcз .profileбеззастережно. Будь ласка, дивіться коментарі та інші відповіді для отримання додаткової інформації.


4
-1, НЕ джерело .bashrcз .profile. Дивіться відповідь @ DanRabinowitz.
nyuszika7h

Принаймні не беззастережно.
nyuszika7h

[ -n "$BASH" -a -f ~/.bashrc ] && . ~/.bashrcбуло б солодким для одного .profile.
Джон У. Сміт

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