Як перезавантажити .bashrc, не виходячи з системи та знову входити?


Відповіді:


2634

Вам просто потрібно ввести команду:

source ~/.bashrc

або ви можете використовувати більш коротку версію команди:

. ~/.bashrc

88
Це не точно так само, як увійти та вийти із системи. Скажіть, у вас був такий рядок у .bashrc:, export PATH=$PATH:fooа потім ви зміните його на export PATH=$PATH:bar. Якщо ви ввійдете в систему та вийдете назад, barбуде лише PATH, але якщо ви зробите те, що пропонуєте, обидва fooі barбудуть у PATH. Ви знаєте спосіб цього?
HighCommander4

7
@ HighCommander4 - дуже незадовільний спосіб зробити те, що ви хочете, - це зробити "bash -l", однак це фактично створює нову нижню частину корпусу, і коли ви вийдете з системи, ви повернетесь до оболонки, що додається, де "foo" все ще знаходиться в PATH. Якщо ви просто зацікавлені в PATH, ви можете зробити "скасувати PATH" та реконструювати його з нуля, але, ймовірно, простіше / безпечніше зробити "PATH = / bin: / usr / bin", перш ніж отримати свій .bashrc. Те, як змінна PATH побудована при вході в систему, насправді є досить складною, що включає в себе щонайменше вхід із логіном (див. "Вхід у людину") та / etc / profile (див. "Man bash").
Джордж Хокінс

2
@Alex ви можете автоматизувати його, додавши рядок ~ / .bashrc в ~ / .bash_profile, хоча я не знаю, чи це хороша практика.
Вівек Гані

4
Я також рекомендую створити псевдонім (який ви можете зберігати у ~ / .bashrc або ~ / .bash_aliases), який відкриється .bashrc, і перезавантажити його після виходу редактора. Ви можете зробити це шляхом об'єднання двох команд за псевдонім, наприклад , як так (якщо ВІМ ваш кращий редактор, в іншому випадку поміняти його на що - то ще): alias editbashrc='vim ~/.bashrc; source ~/.bashrc'. Це зробить редагування набагато більш гладким, оскільки вам не потрібно думати про перезавантаження після виконання редагування, якщо ви користуєтеся власним псевдонімом.
Самуель Лампа

6
Це вплине лише на поточний термінал.
matepal297

283

Або ви можете використовувати:

exec bash

Це робить те саме, і простіше запам'ятати (принаймні для мене).

execКоманда повністю замінює процес оболонки, виконавши зазначену командний рядок. У нашому прикладі він замінює будь-яку поточну оболонку свіжим екземпляром bash(оновленими файлами конфігурації).


13
Не могли б ви пояснити різницю source .bashrcкоманд і exec bash?
muradin

18
@muradin source- це вбудована команда оболонки, яка виконує вміст файлу, переданого як аргумент, у поточній оболонці . Так у вашому прикладі він виконує .bashrc файл у поточній оболонці. І execкоманда замінює оболонку заданою програмою, у вашому прикладі вона замінює вашу оболонку bash (з оновленими файлами конфігурації)
WhoSayIn

3
За моєї гіпер-конкретної обставини, це повністю розгойдувало. Мій Dockerfile виконує сценарій встановлення, який змінює .bashrc. Потім мені це потрібно, щоб перезавантажити, але . ~/.bashrcвиконуватимуться, dashа не bash, тому є помилка, оскільки shoptїї немає. sourceне знайдено в оболонці, тому це рішення також є. Я спробував це, і зображення докера склалося плавно!
m59

9
Елегантний, але "робить те саме" не зовсім коректно. source ~/.bashrcзбереже все ваше середовище оболонки (хоча ймовірно модифіковане джерелом ~/.bashrc), тоді як exec bashзбереже лише змінні середовища вашої поточної оболонки (будь-які спеціальні зміни поточної оболонки з точки зору змінних оболонок, функцій, параметрів втрачаються). Залежно від ваших потреб, може віддавати перевагу той чи інший підхід.
mklement0

12
@SEoF, коли ти кажеш "баш зачаток" і якщо ти думаєш про те, що я думаю, ти думаєш, я повинен сказати, що ти помилився. На відміну від фільму, ви не продовжуєте йти на башти з баш, коли це неодноразово робите exec bash. execКоманда замінює оболонку з програмою, в нашому випадку, Баш. Отже, у терміналі завжди існує один екземпляр bash.
Джон Ред

121

Щоб доповнити та порівняти два найпопулярніші відповіді, . ~/.bashrcі exec bash:

Обидва рішення ефективно перезавантажують ~/.bashrc, але існують відмінності:

  • . ~/.bashrcабо source ~/.bashrcбуде зберегти поточну оболонку :

    • Для модифікацій , які перевантажувальний виключення ~/.bashrcв поточну оболонку ( пошук ) робить, ток оболонка і його стан є збереглися , яка включає в себе змінні середовищах, оболонки, змінних оболонки, оболонка варіанти функцій і історії команд.
  • exec bash, або, більш надійно, exec "$BASH"[1] , замінить поточну оболонку новим екземпляром, а тому збереже лише змінні середовища вашої поточної оболонки (включаючи ті, які ви визначили спеціальними).

    • Іншими словами: Будь-які спеціальні зміни поточної оболонки з точки зору змінних оболонок, функцій оболонок, параметрів оболонки, історії команд втрачаються.

Залежно від ваших потреб, може віддавати перевагу той чи інший підхід.


[1] exec bashтеоретично міг би виконати інший bash виконуваний файл, ніж той, що запустив поточну оболонку, якщо це трапиться в каталозі, переліченому раніше в $PATH. Оскільки спеціальна змінна $BASHзавжди містить повний шлях виконуваного файлу, який запустив поточну оболонку, exec "$BASH"гарантовано використовувати той самий виконуваний файл.
Примітка повторно "..."навколо $BASH: подвійні лапки гарантує , що значення змінної використовується як є, без інтерпретації Bash; якщо значення не має вбудованих пробілів чи інших метахарактерів оболонок (що, мабуть, у цьому випадку), вам не потрібні подвійні лапки, але використовувати їх - це корисна звичка формувати.


Ви відповіли на моє запитання, перш ніж я міг його задати. Це добре знати; Я часто встановлюю свій CLASSPATH на один сеанс.
свиняча риба

Тож навіть якщо я називаю exec "$ BASH", чи змінні, які встановлює .bashrc, знайдуться в оболонці, яку я відкриваю наступним (використовуючи той самий виконуваний файл, що і мій поточний сеанс)?
nitinr708

2
@ nitinr708: Так, exec $BASHбуде джерело ~/.bashrc, тож ви побачите його зміни в середовищі оболонки в новому сеансі.
mklement0

@ Gaming32, я ціную ідею гіперпов'язаної виноски, але вона насправді не спрацювала (і у відповідь така коротка, як ця, це не все так важливо).
mklement0

44

Хтось відредагував мою відповідь, щоб додати неправильну англійську мову, але тут був оригінал, який поступається прийнятій відповіді.

. .bashrc

25
Це буде працювати лише в тому випадку, якщо поточний каталог фактично є вашим домашнім каталогом. Буде працювати наступне:. ~ / .bashrc
Брайан Шоултер

6
Що змушує цю роботу? Що насправді відбувається, коли я роблю ".bashrc"? Дякую!
Джед Даніельс

54
. є ярликом BASH для вбудованої команди "source". Отже, ".bashrc" - це те саме, що "source .bashrc" для інтерпретатора BASH.
Брайан Шоултер

7
Класно. Дякую. Тепер, коли я не знав.
Джед Даніельс

2
Я щойно подав запит на редагування, щоб додати ~/, але оскільки в верхній відповіді показано і те, source ~/.bashrcі інше, . ~/.bashrcмені цікаво, чи слід відповідь видалити як надлишкову.
Макс Геніс

18

Залежно від вашого оточення, просто введіть текст

bash

може також працювати.


15
Однак це викликатиме нову оболонку в поточній, таким чином витрачаючи ресурси. Краще скористайтеся рішенням програми exec @ WhoSayln, яке замінює поточну оболонку на щойно викликану.
Бернхард Вагнер

так просто використовувати джерело. Це абсолютно непотрібно і дратує.
dylnmc

На додаток до коментаря @ BernhardWagner, ви також втратите свою поточну історію баш, якщо ваш ікру
породить

Це хороше рішення, завдяки якому доступ до привілеїв користувача обмежений.
Тунди Піцзель

виклик підпроцесу додає шар складності, який не має додаткового значення.
Алан Березін

18

З цим вам навіть не доведеться вводити "source ~ / .bashrc":

Додайте файл bashrc:

alias rc="vim ~/.bashrc && source ~/.bashrc"

Кожен раз, коли ви хочете редагувати свій bashrc, просто запустіть псевдонім " rc "


15
. ~/.bashrc

. - це вбудований POSIX-мандат


Альтернативи

source ~/.bashrc

sourceє синонімом точки / періоду .в bash, але не в POSIX sh, тому для максимальної сумісності використовуйте період.

exec bash
  • execкоманда замінює оболонку заданою програмою ... - WhoSayIn

2
exec bashяк і раніше успадковує середовище поточної оболонки. exec env -i bashбуде ближче (або exec env -i bash -lякщо ви зараз перебуваєте в оболонці для входу).
чепнер

5

Залежно від вашого оточення, ви можете додати сценарій, щоб автоматично завантажувати .bashrc, коли ви відкриваєте сеанс SSH. Нещодавно я здійснив міграцію на сервер під управлінням Ubuntu, і там, .profile, не .bashrc або .bash_profile, завантажується за замовчуванням. Щоб запустити будь-які скрипти в .bashrc, мені доводилося запускати source ~/.bashrcщоразу, коли сеанс відкривався, що не допомагає при запуску віддалених пристроїв.

Щоб автоматично завантажувати .bashrc під час відкриття сеансу, спробуйте додати це до .profile:

if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

Повторно відкрийте сеанс, і він повинен завантажувати будь-які шляхи / скрипти, які у вас є .bashrc.


У мене це є у ".profile", але воно не працює - кожен раз, коли я виходжу, це потрібно робити вручну. Будь-які пропозиції?
Wayne

4

Я використовував easyengine, щоб налаштувати мій сервер на основі хмар Vultr.
Я знайшов свій файл bash в /etc/bash.bashrc.

Так source /etc/bash.bashrcзробив для мене трюк!

оновлення

Під час налаштування голого сервера (ubuntu 16.04) ви можете використовувати вищевказану інформацію, коли ви ще не встановили ім'я користувача та входите через root.

Найкраще створити користувача (із sudo privledges) та увійти в систему як це ім’я користувача.
Це створить каталог для ваших налаштувань, включаючи файли .profile та .bashrc.
https://linuxize.com/post/how-to-create-a-sudo-user-on-ubuntu/

Тепер ви будете редагувати та (і "джерело") ~/.bashrcфайлу.

На моєму сервері це було розміщено за адресою /home/your_username/.bashrc
(де your_usernameнасправді є нове ім’я користувача, яке ви створили вище, і тепер увійдіть в систему)


4

exec bash - прекрасний спосіб відновити та запустити нову оболонку для заміни поточної. просто для додання відповіді, $ SHELL повертає поточну оболонку, яка є bash. Використовуючи наступне, він перезавантажить поточну оболонку, а не лише баш.

exec $SHELL -l;


3

Для мене те, що працює, коли я змінюю PATH: exec "$BASH" --login


Питання стосується перезавантаження ~/.bashrc, яке не--login буде (безпосередньо) перезавантажуватися; на рівні користувача він замість цього перезавантажить (або або ). ~/.bash_profile~/.bash_login~/.profile
mklement0

3

тип:

source ~/.bashrc

або, у скороченому вигляді:

. ~/.bashrc


1
Знову ж таки, працює лише в тому випадку, якщо ви знаходитесь в домашньому каталозі, а точніше - в каталозі, де .bashrcзнаходиться. Більш правильний спосіб зробити це, як сказано в прийнятій відповіді, - це source ~/.bashrc.
Джон Ред

2

Я використовую наступну команду на msysgit

. ~/.bashrc

скорочена версія

source ~/.bashrc

@jwg прийнята відповідь є. .bashrc. працюватиме лише в тому випадку, якщо ви знаходитесь у домашньому каталозі на msysgit.
Соян V Хосе

@jwg нормально, я тонкий, я згадував, що вам не доведеться вводити 'source ~ / .bashrc', а використовувати більш коротку версію.
Sojan V Jose

@jwg добре, я додав це як редагування до оригінальної відповіді :)
Sojan V Jose

Чому зайва відповідь @Sojan?
nitinr708

@ nitinr708 2014. я ледве пам’ятаю: P. оригінальну відповідь було відредаговано пізніше, що я здогадуюсь.
Соян V Хосе

2

Припускаючи інтерактивну оболонку, і ви хочете зберегти свою поточну історію команд, а також завантажити / etc / profile (який завантажує дані про середовище, включаючи / etc / bashrc, і на Mac OS X завантажує шляхи, визначені в /etc/paths.d/ via path_helper), додайте історію команд і виконайте exec bash з параметром login ('-l'):

history -a && exec bash -l

1

Це також буде працювати ..

cd ~
source .bashrc

7
Так, але він також змінює робочий каталог на ~, що не потрібно.
Альбін

1
Дякуємо за те, що підтримуєте контекст живим @Krinkle
nitinr708

Чи потрібно вказати, ~щоб змінити робочий каталог на домашній каталог користувача?
Кенлі

1

Я помітив, що чиста exec bashкоманда збереже змінні середовища, тому вам потрібно використовувати exec -c bashдля запуску bash у порожньому середовищі.

Наприклад, ви входите в bash, і export A=1, якщо ви exec bash, - A == 1.

Якщо ти exec -cl bash, Aпорожній.

Я думаю, що це найкращий спосіб зробити свою роботу.


-2

я особисто маю

alias ..='source ~/.bashrc'

в моєму файні bashrc, щоб я міг просто використовувати ".." для його перезавантаження.


4
Багато людей використовують ..як псевдонім для cd .., тому це буде дуже заплутано.
Хрещений батько

крім імені псевдоніма хороша ідея. alias rehash='source ~/.bashrc'мій вибір.
Френк Нокк

використовувати щось на кшталт "_rs", яке я використовую для оболонки перезавантаження. я дуже використовую _ для початку своїх псевдонімів; який схожий на js libs підкреслення або квартир.
Jimmy MG Lim Lim
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.