Чим відрізняється .bash_profile від .bashrc?


245

Щоб зробити псевдонім для Терміналу в OS X, ви можете або поставити псевдоніми в .bash_profileабо .bashrc. Яка різниця між ними та чому я вирішив би поставити псевдоніми в одному, а не в іншому?


5
Тут не перешкоджати знанням Unix, але bash є чистим звіром UNIX, щоб ви могли отримати кращі знання або відповісти на це питання кілька разів на веб-сайті партнера. У Unix
bashrc

Також є .profile ... Дивіться це запитання щодо переповнення стека.
Яков Барух

2
Якщо ви brew install bashі використовувати iTerm2, ви можете встановити profile -> commandна /usr/local/bin/bashякий буде завантажуватися .bashrcза замовчуванням після .bash_profile. Це також дає вам Bash 4 смакоти ...
Рей Фосс

Я чув, що .bashrc не використовується роками, і за замовчуванням не працюватиме, а .bash_profile - це справа в macosx. І я спробував .bashrc, і мені не
вийшло,

Відповіді:


247

.bash_profileвиконується для оболонок входу, в той час .bashrcяк для інтерактивних оболонок без входу.

Коли ви входите (введіть ім’я користувача та пароль) через консоль, або сидячи за машиною, або віддалено через ssh: .bash_profileвиконується для налаштування вашої оболонки перед початковим командним рядком.

Але, якщо ви вже увійшли в свою машину і відкрили нове вікно терміналу (xterm), .bashrcвоно виконується перед командним вікном вікна. .bashrcтакож запускається при запуску нового екземпляра bash, ввівши /bin/bashтермінал.

У OS X Terminal за замовчуванням запускає оболонку входу щоразу, тому це дещо відрізняється від більшості інших систем, але ви можете налаштувати це в налаштуваннях.


57
On OS X, Terminal by default runs a login shell every time- Я завжди був такий розгублений, не усвідомлюючи цього. Чудова інформація!
воган

1
@ Алекс, чому термінал OS X запускає оболонку входу щоразу?
Pacerier

17
"Тому що якийсь Apple-розробник спочатку не усвідомив різницю, і тепер це закріплено в деяких мамбо-джамбо".
Сніговий удар

2
Я в OS X і використовую zshell замість bash, а iTerm замість Terminal. Незважаючи на те, що я використовую інший термінал і інший оболонку, ніж обговорюється у відповіді, OS X все ще, здається, розглядає все, що є оболонкою для входу, оскільки вона .zprofileзапускається кожного разу.
Адам Зернер

1
Для тих, хто шукає ретельного пояснення комбінацій оболонок для входу / не входу та інтерактивних / неінтерактивних оболонок та коли вони запускають ці конфігураційні файли, див. Unix.stackexchange.com/a/46856/38715
kevinmicke

45

X11 буде дивитись на ваш, .bashrcа "звичайний" термінал - на.bash_profile

Однак якщо ви додасте до свого списку наступне .bash_profile, ви можете перемістити все у свій .bashrcфайл, щоб об'єднати все в одне місце замість двох:

if [ -f $HOME/.bashrc ]; then
        source $HOME/.bashrc
fi

Або ви могли просто зробити cd ~ ; ln -s .bashrc .bash_profile.
lhf

5
Ці 2 файли конфігурації мають чітко окрему функцію. У деяких випадках необхідно ініціалізувати речі на початку сеансу і лише там ( ~/.bash_profile). Часто також необхідно мати речі, які потрібно визначати поступово на кожному рівні оболонки ( ~/.bashrc). Не найкраща ідея пропонувати придушити цю свободу.
дан

3
@danielAzuelos: Лерч залишив цю частину поза, але джерело OS X Terminal ~/.bash_profileдля кожного нового вікна / вкладки, тому насправді немає способу розділити ці два, що стосується терміналу.
mipadi

14
@mipadi Є ще значення для їх розділення. Наприклад, .bash_profileніколи більше не можна повертатись у дочірньому процесі. Кожен рівень вкладеності джерел Bash .bashrc, так що якщо ви поклали що - щось подібне export A=a:$Aв .bashrc, ваш $Aотримає більше в гніздовий Bash. Зазвичай я залишаю змінну середовища у профілі та псевдоніми в RC.
Франклін Ю

@FranklinYu Можливо, для багатьох людей це не велика угода, але я повністю згоден! Це чудовий технічний момент, який нагадує людям і заслуговує на більшу кількість нагород.
Підфузіон

24

Для macOS код, який потрібно ввести .bash_profileдля консолідації всього, .bashrcполягає в наступному:

if [ -f ~/.bashrc ]; then
    source ~/.bashrc
fi

Це більш конкретно для користувачів терміналу Mac.


6
Хоча це правда, чим це відрізняється від відповіді Лерча з 2012 року ?
Ар’ян

0

TLDR; використовувати .bash_profileдля своїх псевдонімів.

Спосіб роботи різних файлів ініціалізації трохи складніше, і в OSX є деякі важливі спеціальні випадки. Ось основні моменти:

  • На будь-якій платформі Bash виконує один з декількох різних файлів залежно від способу виклику. Деталі тут .
  • Термінальний додаток OSX робить щось нестандартне: він створює кожну нову вкладку чи вікно так, ніби це оболонка для входу, що означає, що .bash_profileвикликається. Таким чином, рекомендації TLDR вище.
  • .bashrcтеж варіант, але це буде викликатися кожен раз , коли ви створюєте подоболочкі (тобто виклику bash), який може створити неефективність при оновленні змінного всередині нього (наприклад, PATH=/bin/foo:$PATH)
  • Інші програми, які мають вбудовані термінали, можуть дотримуватися конвенції програми Terminal App чи ні. Зокрема, Visual Studio Code за замовчуванням цього немає .
  • Програми, викликані через GUI, не створюються з оболонки. Таким чином, існує декілька конкуруючих механізмів встановлення змінних оточуючих для них, які змінюються з роками .
  • Уривки , які вимагають .bashrcвід .bash_profileє досить поширеним явищем. Я не рекомендую цього, але це вподобання.

Чому саме використання .bash_profileпсевдонімів складне? Пункти, які ви перераховуєте лише частково, взагалі стосуються псевдонімів, тож замість того, щоб просто перелічити деякі кулі, які могли б пояснити, чому це здається складним, ви можете запропонувати спосіб полегшити їх у цих обмеженнях?
nohillside

Я бачу вашу думку. Справа не в тому, що використання .bash_profile є складним. Це те, що спосіб виклику файлів є складним. Я оновлю.
Лев

Викликати .bashrc з .bash_profile рекомендується в посібнику з bash GNU - інакше як встановити змінні тощо, які вам потрібні як в оболонках входу, так і в неінтерактивних?
Марк

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